描述:
求A^B的最后三位数表示的整数。说明:A^B的含义是“A的B次方”。
输入:
输入数据包含多个测试实例,每个实例占一行,由两个正整数A和B组成(1<=A,B<=10000),如果A=0, B=0,则表示输入数据的结束,不做处理。
输出:
对于每个测试实例,请输出A^B的最后三位表示的整数,每个输出占一行。
样例输入:
2 3
12 6
6789 10000
0 0
样例输出:
8
984
1
傻瓜代码如下(非快速幂):
1 #include<cstdio> 2 int main() 3 { 4 int a,b; 5 int k=1; 6 while(scanf("%d %d",&a,&b)!=EOF&&(a!=0&&b!=0)){ 7 for(int i=1;i<=b;i++){ 8 k*=a; 9 k%=1000; 10 } 11 printf("%d\n",k); 12 k=1; 13 } 14 15 return 0; 16 }
快速幂代码:
1 #include<cstdio> 2 int fastpow(int a,int b,int kkk){ 3 int ans=1; 4 while(b > 0){ 5 if(b & 1){ 6 ans = ans*a%kkk; 7 } 8 b >>= 1; 9 a= a*a%kkk; 10 } 11 return ans; 12 } 13 int main() 14 { 15 int a,b; 16 int sum; 17 while(scanf("%d %d",&a,&b)!=EOF&&(a!=0&&b!=0)){ 18 sum = fastpow(a,b,1000); 19 printf("%d\n",sum); 20 } 21 22 return 0; 23 }
解题思路(快速幂):
(11的二进制是1011.即11 = 2³×1 + 2²×0 + 2¹×1 + 2º×1。
备忘录位运算:右移一位相当于除2.左移一位相当于乘2)
本题正式思路:while循环就是控制当b为0的时候循环结束。if语句就是使用按位与“&”,当两边都为1,表达式为1,这个是用来判断二进制数最后一位是否为1。如果为1,ans就要乘x^i,i为该位在二进制数中的位置。>>为位运算符,右移一位,即去掉已经计算过的部分。最后的a= a*a%kkk;用来标记记录x^2^i,循环i次即去掉了i位,当第i+1位为1时,sum就要乘x^2^i。~
时间: 2024-11-05 18:22:52