题意:
输入n^k,输出n^k的前3位与后3位.
思路:
最后的三位可以直接快速幂取余,但要注意不够要补前导0.
求前三位则需要一些数学知识对于给定的一个数n,它可以写成10^a,其中这个a为浮点数,则n^k=(10^a)^k=10^a*k=(10^x)*(10^y);
其中x,y分别是a*k的整数部分和小数部分对于t=n^k这个数,它的位数由(10^x)决定,它的位数上的值则有(10^y)决定,因此我们
要求t的前三位,只需要将10^y求出,再乘以100,就得到了它的前三位。
fmod(x,1)可以求出x的小数部分
tmp就是上面说的y
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<cmath>
using namespace std;
typedef long long ll;
const ll mod = 1000;
int fast_pow(ll tmp, ll k)
{
tmp = tmp % mod;
int ans = 1;
while(k)
{
if(k&1)
ans = (ans*tmp) % mod;
k >>= 1;
tmp = tmp*tmp % mod;
}
return ans;
}
int main()
{
int T;
ll n, k;
scanf("%d", &T);
for(int kase = 1; kase <= T; kase++)
{
scanf("%lld%lld", &n, &k);
int x = (int)pow(10.0, 2.0+fmod(k*log10(1.0*n), 1));
int y = fast_pow(n, k);
printf("Case %d: %d %03d\n", kase, x, y);
}
return 0;
}
本文介绍了一种结合快速幂算法和数学方法来解决求解n^k次方前3位与后3位的问题。通过快速幂算法高效计算n^k的最后三位,并利用数学原理求出前三位。代码实现简洁,易于理解。
&spm=1001.2101.3001.5002&articleId=64442335&d=1&t=3&u=9641dd94c93a4149afb3c804822c448a)
604

被折叠的 条评论
为什么被折叠?



