这题和上一个快速幂取模有什么区别。。。
题目如下:
Problem Description
求A^B的最后三位数表示的整数。
说明:A^B的含义是“A的B次方”
Input
输入数据包含多个测试实例,每个实例占一行,由两个正整数A和B组成(1<=A,B<=10000),如果A=0, B=0,则表示输入数据的结束,不做处理。
Output
对于每个测试实例,请输出A^B的最后三位表示的整数,每个输出占一行。
Sample Input
2 3
12 6
6789 10000
0 0
Sample Output
8
984
1
解析可以参照这个链接的博客:
https://blog.csdn.net/qq_45539440/article/details/104916450
题目叫Rightmost Digit
我这里直接把这道题代码发出来了,改了几行代码就交上去了
#include <stdio.h>
void qpmod(long long a,long long b){
long long c=1000,ans=1;
while(b!=0){
if(b&1)
ans=(ans*a)%c;
a=(a*a)%c;
b>>=1;
}
printf("%lld\n",ans);
}
int main(){
long long a,b,sum=0;
while(1){
scanf("%lld %lld",&a,&b);
if(a==0&&b==0) break;
qpmod(a,b);
}
}
不知道这个还能不能偷鸡(手动滑稽)~~
但是解析不能就这么水了:
这里用了一次二分法:(一定要用C++交答案!!!)
讲一下原理:(这是个求幂的方法)
当你所求的目标为a^b 的后三位时,我们可以不必计算a^b, 比如计算5^31 ,那么原式=5^1 * 5^2 * 5^4 5^8 * 5^16 =5(2^0 + 2^1 + 2^2 + 2^3 + 2^4)我们只需要将b拆解成以2为底的等比数列的和即可,你可以将b看成一个二进制数的思想,每次利用b%2和b/=2来对其末位进行数位拆解,并将每一种拆解下得到的结果进行累乘,当b拆解完毕之后便可以得到答案。
代码如下:
#include <stdio.h>
int main(){
int a,b;
int ans = 1;
while(1){
scanf("%d%d",&a,&b);
if(a==0&&b==0)break;
a=a%1000;
ans = 1;
for(int i=1;i<=b;i++){
ans = ans*a;
ans %= 1000;
}
printf("%d\n",ans);
}
return 0;
}