1060题目大意:
第一行输入一个整数代表要输入数据的组数,其余每一行输出N;要求输出结果N的N次方的最左边一位的数字(N<=10亿);
例如:如果N=2;计算过程是2×2 =4;结果输出为4;
如果N=3;计算过程是3×3×3 = 27;结果输出为2;
如果N=4;计算过程为4×4×4×4 = 256 ;结果输出为2;
因此,此题猛一看的做法是通过递归进行求职,但是当数值大小为10000以上时,递归就已经超出了承受范围。
我发现杭电上的题还好,POJ上的题很多是考察你的数学基础的。
例如这道题如果用数学思维考虑那就相当简单了。
N的N次方的结果显然是太大了,我们不能硬存储,所以我们可以通过math里面的log方法进行操作。
log10(N*N) = N×log10N
只要是整数就可以转化为科学计数法的形式即10的m次幂+a(a代表小数位)
所以N*N = 10的m次幂+a;
N×log10N = m+log10a;
我们设定x = N×log10N;所以x =m+log10a;
a = 10的(x-m)次幂;然后通过int类型的强制转换得到最左边一位数。
程序实现代码如下:(这个代码参考别人的写的)
#include <stdio.h>
#include <math.h>
void main()
{
int t;
scanf("%d",&t);
while(t--){
unsigned long n;
int a;
double x;
scanf("%ld",&n);
x=n*log10(n*1.0);
x-=(__int64)x; a=pow(10.0, x);
printf("%d",a);
}
}