ACM1060

第二次做到,还是没搞清楚,记录一下。数学啊!

题目:计算N^N的最高位的值。1<=N<=1,000,000,000

思路:因为N会很大,所以N^N必然是会溢出,所以不能先求出N^N的值,再去求最高位。

1.求出N^N的以10为底的对数的小数部分,k = N*log10(N) - floor(N*log(N));//floor()向下取整

2.N^N的最高位 = 10^k;

以上就是公式,不过重要的还是要解决一下为什么,才能理解深刻些。

解析:一个数M,M 可以表示为 10^log10(M)= 10^(a+b) = 10^a*10^b, a为指数的整数部分,b为指数的小数部分。可以知道10^a就是1,10,100...(a = 0,1,2...)。我们知道一个数除以10^c(假设c就是M的位数-1)结果取整就是该数的最高位了。可知,a是等于c的,很明显,M 除以10^a等于10^b,所以10^b结果取整就是M的最高位了。

程序如下:

#include <stdio.h>
#include <math.h>
int main()
{
	int t,n;
	double k;

	scanf("%d",&t);
	while(t--)
	{
		scanf("%d",&n);
		k = n * (log10(n)) - floor(n * (log10(n)));
		k = pow(10.0,k);
		printf("%d\n",(int)k);
	}
	return 0;
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值