hdoj1060解法

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); 
	}
}


 



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值