求n^k的前三位数和后三位数(log 10……)

E - Leading and Trailing

在这里插入图片描述
前三位:
设x = log (n^k) = k * log10(n),
那么10 ^ x = n ^ k.将x = a(整数) + b(小数),
整数部分10^a是小数点的位置,并不影响前三位数字。
故只需要求出10^b取前三位。
使用fmod(a, 1)表示求浮点型数 a 的小数部分。

后三位:
03d
很好求,快速幂取模就好了,注意输出为3位,如果后三位是022,那么必须输出022,不能输出22

#include<stdio.h>
#include<math.h>
#define ll __int64
ll QuackMod(ll a,ll b,ll mod) { //快速幂算法
	ll ans=1;
	if(!b)		return 1;
	ans=QuackMod(a*a%mod,b/2,mod);
	if(b&1)		ans=ans*a%mod;//奇数 
	return ans;
}
 
int main() {
	int t,cont=0;
	scanf("%d",&t);
	while(t--){
		ll n,k;
		scanf("%I64d%I64d",&n,&k);
		int strat=(int)pow(10.0,2.0+fmod(k*log10(n*1.0),1.0));//前三位
		int end=(int)QuackMod(n,k,1000);//后三位
		printf("Case %d: %d %03d\n",++cont,strat,end);// ll 输出就溢出! 
	}//忽略了后三位的首位是 0 的情况
	return 0;
}

ps:[C++中__int64用法](https://blog.csdn.net/jyl1159131237/article/details/77822183/)可以借鉴这篇博客

发布了60 篇原创文章 · 获赞 22 · 访问量 6966

猜你喜欢

转载自blog.csdn.net/weixin_43786143/article/details/89918440