HDU2035 人见人爱A^B(快速幂)

描述:

          求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<cstdio>
 2 int main()
 3 {
 4     int a,b;
 5     int k=1;
 6     while(scanf("%d %d",&a,&b)!=EOF&&(a!=0&&b!=0)){
 7         for(int i=1;i<=b;i++){
 8             k*=a;
 9             k%=1000;    
10         } 
11         printf("%d
",k);
12         k=1;
13     }
14     
15     return 0;
16 } 

快速幂代码:

 1 #include<cstdio>
 2 int fastpow(int a,int b,int kkk){
 3     int ans=1;
 4     while(b > 0){
 5         if(b & 1){
 6             ans = ans*a%kkk;
 7         }
 8         b >>= 1;
 9         a= a*a%kkk;
10     }
11     return ans;
12 }
13 int main()
14 {
15     int a,b;
16     int sum;
17     while(scanf("%d %d",&a,&b)!=EOF&&(a!=0&&b!=0)){
18         sum = fastpow(a,b,1000);
19         printf("%d
",sum);
20     }
21     
22     return 0;
23 } 

解题思路(快速幂):

          (11的二进制是1011.即11 = 2³×1 + 2²×0 + 2¹×1 + 2º×1。

          备忘录位运算:右移一位相当于除2.左移一位相当于乘2)

          本题正式思路:while循环就是控制当b为0的时候循环结束。if语句就是使用按位与“&”,当两边都为1,表达式为1,这个是用来判断二进制数最后一位是否为1。如果为1,ans就要乘x^i,i为该位在二进制数中的位置。>>为位运算符,右移一位,即去掉已经计算过的部分。最后的a= a*a%kkk;用来标记记录x^2^i,循环i次即去掉了i位,当第i+1位为1时,sum就要乘x^2^i。~

         

 

原文地址:https://www.cnblogs.com/xzt6/p/5723515.html