HDU1040 Leftmost Digit

题目描述

T组数据 输入N(1<=N<=1,000,000,000),给出N的N次方的首位数字。

样例

输入

2

3

4

输出

2

2


解题思路

显然不能暴力做,即使是用java的大数也会T到大学毕业…………

遇到这种题,要反应过来往数学上想。

N^N=10^(N*lgN)

我们知道N*lgN其实是可以用long long装下的,那么进一步考虑…………

是不是有一个公式 x = [x] + (x)?

[x]是地板函数也叫高斯函数 表示不超过x的最大整数 通俗来说就是x的整数部分

(x)=x-[x],也就是小数部分

回到题上来…………10^(N*lgN)不就是10^[N*lgN] * 10^(N*lgN)吗?

第一项10^[N*lgN]无非就是好多0,对最后的结果其实并没有影响!而且发现 10^(N*lgN)是在1到10之间的。因此最后强制转化一下类型,将小数甩掉就可以得到最终的结果了。


另外注意一下math库里的对数函数log10()表示lg  而log()表示求ln 不要记混了

下面贴一下代码

#include <cstdio>
#include <cmath>
int main()
{
	int t;
	scanf("%d",&t);
	while(t--){
		int n;
		scanf("%d",&n);
		double s = n*log10(n);
		printf("%d\n",(int) pow(10.0,(s - (long long)s)));
	}
	return 0;
}






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值