题目描述
夏天蚊子真多,睡不着,怎么办呢?小贤我没办法,只好坐在桌前发呆,拿着笔乱画,无意义的计算着,醒悟过来的时候,发现我算了好几个数字出来,很长很长,不过我隐约记得我是在计算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 long
int 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
如果对数接近整数,可以比较两次 都不等不是,一个相等结束比较
然后通过取模的方式来判断是不是该数。