求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的二进制转换。