二分求幂

Posted yuxiaoba

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二分求幂相关的知识,希望对你有一定的参考价值。

      二分求幂用于快速求得a的b次方。

      这里的方法是求得b的二进制数。如求3的31次方,首先求的31的二进制数 11111,即拆3的即  3^31 = 3^0 * 3^1 * 3^2 * 3^4 * 3^8 * 3^16

 

题目描述:

 

求A^B的最后三位数表示的整数。说明:A^B的含义是“A的B次方”

 

输入:

 

输入数据包含多个测试实例,每个实例占一行,由两个正整数A和B组成(1<=A,B<=10000),如果A=0, B=0,则表示输入数据的结束,不做处理。

 

输出:

 

对于每个测试实例,请输出A^B的最后三位表示的整数,每个输出占一行。

 

样例输入:

 

2 3
12 6
6789 10000
0 0

 

样例输出:

 

8
984
1

 

 1 #include<stdio.h>
 2 #include<stdlib.h>
 3 int main()
 4 {
 5     int a,b;
 6     int ans;
 7     while( scanf("%d %d",&a,&b)!=EOF)
 8     {
 9         if( a==0 && b==0) break;
10 
11         ans = 1;
12         while( b!=0)
13         {
14             //把b转换为二进制
15             if( b%2==1)
16             {
17                 //如果当前二进制位为1则需要累乘a的2^k次
18                 ans *= a;
19                 ans %=1000;  //求后三位
20             }
21             b /= 2;
22             a *= a;  //求下一个二进制位的权重
23             a %=1000;
24         }
25         printf("%d\n",ans);
26     }
27     return 0;
28 }

 

 

 

 

以上是关于二分求幂的主要内容,如果未能解决你的问题,请参考以下文章

求幂函数代码比较

题目1441:人见人爱 A ^ B(二分求幂)

二分求幂

HDU 3461 Code Lock(并查集+二分求幂)

数学问题-二分求幂例题

求幂的 SIMD 代码