zoukankan      html  css  js  c++  java
  • 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
    
  • 相关阅读:
    Oracle 11g R2 常用配置与日志的文件位置
    DBA常用SQL之会话与等待事件
    SSH框架之Spring第三篇
    SSH框架之Spring第二篇
    SSH框架之Spring第一篇
    SSH框架之Struts2第三篇
    SSH框架之Struts2第一篇
    SSH框架之Struts2第二篇
    SSH框架之Hibernate第四篇
    SSH框架之Hibernate第三篇
  • 原文地址:https://www.cnblogs.com/a1439775520/p/13078433.html
Copyright © 2011-2022 走看看