zoukankan      html  css  js  c++  java
  • 算法笔记_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
  • 相关阅读:
    js基础
    装饰模式,代理模式,继承
    Retrofit源码解析
    Android Studio自定义Plugin
    EMV笔记:持卡人认证(CVM)
    阿里代码规范笔记
    文章博客网址收集
    MultiDex解析
    EMV随记(1)
    RSA笔记
  • 原文地址:https://www.cnblogs.com/liuzhen1995/p/6419628.html
Copyright © 2011-2022 走看看