求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/)可以借鑑這篇博客

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章