算法笔记_040:二进制幂(Java)

目录

1 问题描述

2 解决方案

2.1 从左至右二进制幂

2.2 从右至左二进制幂

 


1 问题描述

使用n的二进制表示,计算an次方。

 


2 解决方案

2.1 从左至右二进制幂

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

 

具体代码如下:

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:
10
请输入一个数字a:
2
那么2的10次方结果:1024


请输入一个数字n:
8
请输入一个数字a:
10
那么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:
13
请输入一个数字a:
2
那么2的13次方结果:8192


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