求A^B的最后三位数表示的整数,0 0表示输入数据结束,不做处理。
样例输入:
2 3
12 6
6789 10000
0 0
样例输出:8 984 1
思路:分解a的b次方变为a的2^k次的积,并尽可能减少分解结果的个数。在指数层面即分解b为若干个2^k的和。分解b为若干个2^k的和且分解个数最少,即求b的2进制数。求得b的2进制后,各个二进制位为1的数位所代表的权重即为分解结果。二分求幂大大减少其乘法运算的次数。a^b的后三位只与a的后三位数和b有关,那么在保存为计算结果最终值得中间值也只需保存其后三位。
#include<stdio.h> int main() { int a,b; while(scanf("%d%d",&a,&b)!=EOF) { if(a==0&&b==0) break; int ans=1;//保存最终结果变量,初始值为1 while(b!=0) { if(b%2==1)//若当前进制为1,则需要累乘a的2^k次至变量ans,其中2^k为当前二进制位的权重 { ans*=a;//最终结果累乘a ans%=1000;//求其后三位数 } b/=2; a*=a;//求下一位二进制的权重,a求其平方,即从a的1次,2次,3次~ a%=1000;//求a的后三位 }//一边计算b的二进制,一边计算a的2^k,并将需要的部分累乘到ans printf("%d\n",ans); } return 0; }即从b的最低位开始依次求得b的各二进制位,在当前二进制位为1的情况下将a累乘到变量ans上,在完成本位操作后对a求平方计算下一位二进制的权重,直到完成b的二进制转换。