zoukankan      html  css  js  c++  java
  • 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。~

             

     

  • 相关阅读:
    Python 分页功能
    Django 项目CRM总结
    Django 如何实现文件下载
    Python连接redis方法
    Python 微信公众号发送消息
    Python 邮件发送消息
    python 函数内置方法short_desc
    Django 定制验证码
    Django Ajax学习二之文件上传
    Django Ajax学习二之csrf跨站请求伪造
  • 原文地址:https://www.cnblogs.com/xzt6/p/5723515.html
Copyright © 2011-2022 走看看