admin 管理员组

文章数量: 1184232

N^N

题目描述

夏天蚊子真多,睡不着,怎么办呢?小贤我没办法,只好坐在桌前发呆,拿着笔乱画,无意义的计算着,醒悟过来的时候,发现我算了好几个数字出来,很长很长,不过我隐约记得我是在计算N^N不过我不知道N是多少了,同时,数字也有些模糊不清,但还好,数字的位数不会出错。也就是如果我计算的是3^3=27,我可能写成了29或20之类的,但不会多或者少一位。
现在我想让你帮我看看我算的N到底是多少。

输入

输入样例有多组,每组一行,是一个N^N的值,一行中皆为0~9的字符,无空格(0

输出

对于每组样例,输出一行,如果该数字是N^N则输出N的值,否则输出NO。

样例输入

27
29
285311670611

样例输出

3
NO
11

#include<iostream>
#include <cmath>using namespace std;#define MOD 1000000443
#define LL long longint main(){string str;double len;int len1 = 0;LL s, s1;while (cin >> str) {len = str.length();for (int i = 1; i < 10000; ++i) {if (len <= i*log(i)/log(10)){break;}len1 = i;}s = 0;for (int i = 0; i < len; ++i) {s = (10*s + (str[i]-'0')) % MOD;}s1 = 1;for (int i = 0; i < len1; ++i) {s1 = (s1 * len1) % MOD;}if (s == s1) {cout << len1 << endl;continue;}len1++;s1 = 1;for (int i = 0; i < len1; ++i) {s1 = (s1 * len1) % MOD;}if (s == s1) {cout << len1 << endl;} else {cout << "NO" << endl;}}return 0;
}
    用字符串,先根据长度查找范围(取对数),然后求出该位数对应的 N^N 中的 N是几。

例如
9* log(9) =8.5881825849539238713105022585921
9^9=387420489 ==> 9 位
按照位数 匹配对应的N^N
如果对数接近整数,可以比较两次 都不等不是,一个相等结束比较
然后通过取模的方式来判断是不是该数。

本文标签: NN