1763: N^N
时间限制: 1 Sec 内存限制: 128 MB
[提交][状态][讨论版]
题目描述
现给你一个正整数N,请问N^N的最左边和最右边的数字是什么?
输入
输入包含多组测试数据。每组输入一个正整数N(N<=1000000)。
输出
对于每组输入,输出N^N的最左边和最右边的数字。
样例输入
3
5
样例输出
2 7
3 5
提示
来源
/*
n^n非常大,直接算是得不得结果的。但是我们知道任意一个整数数都可以化成a*10^k
比如16 = 1.6 * 10^1,27 = 2.7 * 10 ^1
那么对于本题n^n = a * 10 ^ k
根据题意,我们要想办法算出a大概是多少,然后强制转换为整型,其结果就是n^n结果最左边的数
我们可以两边同时取以10为底的对数:
log10(n^n) = log10(a*10^k)
左边:
log10(n^n) = nlog10(n)
右边:
log10(a*10^k) = log10(a) + log10(10^k)
nlog10(n) = log10(a) + k
我们知道`a>0&&a<10,所以 log10(a)的结果是非常小的,所以nlog10(n) ≈ k`
so:
log10(a) = nlog10(n) - int(nlog10(n))
a = 10^(nlog10(n) - int(nlog10(n))
ans1 = int(a) //最左边的数
对于最右边的数,比较好算,n^n按我们手动计算过程当中可以发现,每次的结果的最后一位只和上次结果的最后一位有关,所以直接来个快速幂,不断对10取余就行。
*/
#include <iostream>
#include <math.h>
using namespace std;
typedef long long LL;
LL quickPow(LL a,LL b)
{
//a %= 10;//n最大1e6,这里不取也可以
LL res = 1;
while(b)
{
if(b&1) res = res * a % 10;
a = a*a%10;
b >>= 1;
}
return res;
}
int main()
{
double n;
while(cin>>n)
{
int k = n*log10(n);
double x = pow(10,n*log10(n)-k);
LL t = n;
cout<<(int)x<<" "<<quickPow(t,t)<<endl;
}
return 0;
}