1.题目简介:
求一个n^n的最左一位。n也是大数,大小是0<n<1,000,000,000, 所以直接算要么是超时,要么是数据溢出。所以不能硬算。
2.技巧点拨:
(由于要推导,我将过程写在了纸上)
3.困难实现:
①。怎么取整,如1.438...,怎么得到1?
用强转类型的方法很容易得到,如(int )1.438.. = 1.即它的最左边是1。
②。数字很大,建议用long long型。(我用int型提交错误了一次)。
4.代码分析:
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
int kase;
long long n;
int m;
cin >> kase;
while(kase--)
{
cin >> n;
float term = n*log10(n)-(long long)(n*log10(n));
m = (int)pow(10,term);
cout << m << endl;
}
return 0;
}
5.带入数字看代码。
比如,我带上n = 5,即要求5^5的最左边的个数。
m = n x n = 25;
m = 10^( 5 x log10(5) );
m = 10^( 5 x log10(5) - (int)(5 x log10(5)) + (int)(5 x log10(5)) ), 前两项的和是求小数项,最后一项是求整数项。
10的整数项次都是1后面许多0,(如1....0),,10的小数次结果取整后即为第一项。