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的二进制转换。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值