二分求幂——人见人爱 A^B(九度57题)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wdays83892469/article/details/79858562

二分求幂

若要求2^32次方,首先想到要将2循环相乘32次。但实际上不需要这么麻烦
按照原始策略解的时候,当完成前16次循环时,就已经获得了2^16的值,就不需要随后的16次循环了
只需要将2^16求平方即可。同理 2^16只需要对2^8求平方即可,2^8只需要求2^4的平方即可……
这样本来32次乘法才能完成的工作,只需要6次乘法便可以完成。
2^32具有某种特性,它是2的整数次方,其实这个规律对于一般数也是适用的
我们分解a的b次变为若干个a的2^k个的积,并尽量减少分解结果的个数。
指数层面,即分解b为若干个2^k的和,并尽可能减少分解结果的个数。
分解b为若干个2^k的和且分解个数最小,即求b的二进制数。
在求得b的二进制数后,各个二进制位为1的数位所代表的权重即是分解结果。

人见人爱 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
1
2
3
4
5
样例输出:

8
984
1

/*
 * A^B的后三位只与 A的后三位数和B有关 只保留三位数即可
 */
import java.util.Scanner;

public class 二分求幂 {
    public static void main(String[] args) {
        Scanner input=new Scanner(System.in);
        int a=input.nextInt();
        int b=input.nextInt();
        if (a==0&&b==0) {
            return ;
        }
        int ans=1;//结果初始值为1
        while (b!=0) {//若b!=0,即对b转换二进制过程未结束
            if ((b&1)!=0) {//b%2==1  若当前二进制为1,则需要累乘a的2^k至变量ans,其中w^k次为当前二进制位的权重
                ans*=a;//结果累乘a
                ans%=1000;//保留后三位
            }
            b>>=1;//b/=2 b除以2 (b转成2进制)
            a*=a;//求下一位二进制位的权重,a求其平方,即从a的1次开始,依次求的a的2次,a的4次 (是否要累乘进去的数据)
            ans%=1000;
        }
        System.out.println(ans);
    }
}

猜你喜欢

转载自blog.csdn.net/wdays83892469/article/details/79858562
今日推荐