C 数据结构之二分求幂

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

猜你喜欢

转载自blog.csdn.net/joanna_or_zhouzhou/article/details/80362005