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 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
如果对数接近整数,可以比较两次 都不等不是,一个相等结束比较
然后通过取模的方式来判断是不是该数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值