16 二分求幂
理论说明
该问题解决的是如何快速的求得a的b次方。一般做***是使用了一个循环次数为b的for循环,并在每次循环时都累乘a,这样在b次循环结束时就能获得a的b次方。但是显然这种方法并不是最优的。按照这个策略,当我们循环到第i次时,此时的累乘的结果即为2的i次。那么当我们完成了前16次循环时,我们就得到了a的16次的数字,思考要获得a的32次我们还需要继续完成后续的16次循环吗?答案是否定的,当我们已经获得了a的16次时,我们只需将a的16次对应的数字求平方,我们即可计算出a的32次方,这样后16次乘法运算我们只用了一次平方就就完成了。既然a的32次可以由a的16次求平方取到,那么a的16次呢?你还确定我们需要使用16次循环来获得该值么?答案也是否定的,a的16次只需要对a的8次求平方即可,同理要求a的8次求平方即可,同理要求a的8次我们只需对a的4次求平方....这样依次往复。 这样,原本需要使用32次乘法才能完成的工作,现在只需要6次乘法便能完成,效率提高了将近6倍,这种求某个数的指定次幂即为二分求幂。
题目描述
求A^B的最后三位数表示的整数。
输入说明
输入数据包含多个测试实例,每个实例占一行,由两个正整数A和B组成,如果A=0,B=0,则表示输入数据的结束,不做处理。
输出说明
对于每个测试用例,请输出A^B的最后三位表示的整数,每个输出占一行。
样例展示
样本输入:
2 3
12 6
6789 10000
0 0
样本输出:
8
984
1
C++代码
#include<iostream>
using namespace std;
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) { //若b不为0,即对b转换二进制过程没有结束
            if(b%2==1) { //若当前二进制位1
                ans=ans*a; //如果为1
                ans%=1000;
            }
            b/=2;
            a*=a; //a都平方一下
            a%=1000; //求a的后三位
        }
        printf("%d\n",ans);
    }
    return 0;   
}
同类题目
- 
A sequence of numbers
 - 
TrA
 
Leetcode题目太多,不知道如何准备高校夏令营?欢迎关注本专栏,和本小白一起准备夏令营吧! 本专题的规划如下: 截止到4月下旬:以王道考研为依托,提供夏令营机考的准备计划,打好基础 截止到5月中旬:以剑指offer进一步加强 本专题的内容如下: 1. 给出题目的在线测试链接,方面您检查代码的正确性 2. 给出题解

海康威视公司福利 1149人发布