算例一【人见人爱A ^ B (九度教程第57 题)】
-
题目描述
-
解题思路
①二分求幂的思想:12^6= 12*12*12*12 *1 * 12*12*1 ____________
6的二进制: 1 1 0
-
解题代码
#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) //若b不为0,即对b转换二进制过程未结束
{
if (b % 2 == 1) //若当前二进制位为1,则需要累乘a的2^k 次至变量ans,其中2^k次为当前二进制位的权重
{
ans *= a; //最终结果累乘a
ans %= 1000; //求其后三位数
}
b /= 2; //b除以2
a *= a; //求下一位二进制位的权重, a求其平方,即从a的1次开始,依次求的a的2次, a的4次...
a %= 1000; //求a的后三位
} //一边计算b的二进制值,一边计算a的2^k次,并将需要的部分累乘到变量ans上
printf ("%d\n",ans); //输出
}
return 0;
}
-
注意点
①这里有很重要的一点就是:10000^10000一定会溢出,想都不用想,马上找简化的方法,这里因为只输出最后三位而且过程中都只出现的乘法,所以只要每次运算的时候都保留三位,就可以用int型解决这些数字的存储问题且不影响精度。所以说啊,发现溢出一定要检查是否有简化的方法!!
②这题的思路还不错的,记下二分求幂的方法!