Java实现二进制幂

1 问题描述
使用n的二进制表示,计算a的n次方。

2 解决方案
2.1 从左至右二进制幂

此方法计算a的n次方具体思想,引用《算法设计与分析基础》第三版一段文字介绍:

在这里插入图片描述

在这里插入图片描述

package com.liuzhen.chapter6;

import java.util.ArrayList;
import java.util.Scanner;

public class LeftRightBinaryExponentiation {
    //返回数字n的二进制数组
    public int[] get10To2(int n){
        ArrayList<Integer> list = new ArrayList<Integer>();
        while(n > 0){
            list.add(n % 2);
            n = n / 2;
        }
        int len = list.size();
        int[] result = new int[len];
        for(int i = 0;i < len;i++)
            result[i] = list.get(len-1-i);
        return result;
    }
    
    /*
     * 函数功能:返回数字a的n次方结果
     */
    public int getPowerA(int a,int n){
        int[] nTwo = get10To2(n);
        int result = a;
        for(int i = 1;i < nTwo.length;i++){
            result = result*result;
            if(nTwo[i] == 1)
                result *= a;
        }
        return result;
    }
    
    public static void main(String[] args){
        Scanner in = new Scanner(System.in);
        System.out.println("请输入一个数字n:");
        int n = in.nextInt();
        System.out.println("请输入一个数字a:");
        int a = in.nextInt();
        LeftRightBinaryExponentiation test = new LeftRightBinaryExponentiation();
        System.out.println("那么"+a+"的"+n+"次方结果:"+test.getPowerA(a, n));
    }
}

运行结果:

请输入一个数字n:
请输入一个数字a:
那么2的10次方结果:1024


请输入一个数字n:
请输入一个数字a:
那么10的8次方结果:100000000

2.2 从右至左二进制幂
引用《算法设计与分析基础》第三版一段文字介绍:

在这里插入图片描述

在这里插入图片描述

package com.liuzhen.chapter6;

import java.util.ArrayList;
import java.util.Scanner;

public class RightLeftBinaryExponentiation {
        //返回数字n的二进制数组
        public int[] get10To2(int n){
            ArrayList<Integer> list = new ArrayList<Integer>();
            while(n > 0){
                list.add(n % 2);
                n = n / 2;
            }
            int len = list.size();
            int[] result = new int[len];
            for(int i = 0;i < len;i++)
                result[i] = list.get(len-1-i);
            return result;
        }
        //返回数字a的n次方结果
        public int getPowerA(int a,int n){
            int[] nTwo = get10To2(n);
            int temp = a;
            int len = nTwo.length;
            int result;
            if(nTwo[len-1] == 1)
                result = a;
            else
                result = 1;
            for(int i = len-2;i >= 0;i--){
                temp = temp*temp;
                if(nTwo[i] == 1)
                    result *= temp;
            }
            return result;
        }
        
        public static void main(String[] args){
            Scanner in = new Scanner(System.in);
            System.out.println("请输入一个数字n:");
            int n = in.nextInt();
            System.out.println("请输入一个数字a:");
            int a = in.nextInt();
            RightLeftBinaryExponentiation test = new RightLeftBinaryExponentiation();
            System.out.println("那么"+a+"的"+n+"次方结果:"+test.getPowerA(a, n));
        }
}

运行结果:

请输入一个数字n:
请输入一个数字a:
那么2的13次方结果:8192


请输入一个数字n:
请输入一个数字a:
那么10的8次方结果:100000000
原文地址:https://www.cnblogs.com/a1439775520/p/13077948.html