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

Java实现二进制幂的更多相关文章

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

    目录 1 问题描述 2 解决方案 2.1 从左至右二进制幂 2.2 从右至左二进制幂   1 问题描述 使用n的二进制表示,计算a的n次方. 2 解决方案 2.1 从左至右二进制幂 此方法计算a的n次 ...

  2. Java基础-二进制以及字符编码简介

    Java基础-二进制以及字符编码简介 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 想必计算机毕业的小伙伴或是从事IT的技术人员都知道数据存储都是以二进制的数字存储到硬盘的.从事开 ...

  3. java十进制二进制互转

    1. 十进制转二进制 原理:给定的数循环除以2,直到商为0或者1为止.将每一步除的结果的余数记录下来,然后反过来就得到相应的二进制了. 比如8转二进制,第一次除以2等于4(余数0),第二次除以2等于2 ...

  4. java基础 二进制补码

    二进制补码: 1.计算机系统的内部以二进制形式存储数据. 2.在Java程序中输入的十进制的数据都会被自动转换为二进制,Java内部也以二进制来进行数值运算,但返回的结果是十进制. 二进制补码的原理: ...

  5. Java 算法-快速幂

    1 什么是快速幂? 快速幂,顾名思义就是快速的求次幂,例如:a^b,普通的算法就是累乘,这样的计算方法的时间复杂度就是O(n),而快速幂的方法使得次幂的计算方法的时间复杂度降低到O(logn).  假 ...

  6. java:判断二进制数据中第n位是否为1

    可以使用位运算来判断. &是位的与运算符,是指二进制数按位“与”的操作, 逻辑与就是两者都为真的时候才为真,其他真假,假真,假假的运算结果都是假.二进制写法如下 1 & 1 = 1 , ...

  7. Java:二进制(原码、反码、补码)与位运算

    一.二进制(原码.反码.补码) 二进制的最高位是符号位(“0”代表正数,“1”代表负数): Java中没有无符号数: 计算机以整数的补码进行运算: 1.  原码:将一个整数转换成二进制表示 以 int ...

  8. java图片二进制相互转换

    import java.awt.image.BufferedImage; import java.io.ByteArrayInputStream; import java.io.ByteArrayOu ...

  9. java中 二进制 八进制 十六进制 十进制 相互转换 最简方法

    package com.swift; import java.util.Scanner; public class Hex2Decimal { public static void main(Stri ...

随机推荐

  1. [poj2778 DNA Sequence]AC自动机,矩阵快速幂

    题意:给一些字符串的集合S和整数n,求满足 长度为n 只含charset = {'A'.'T‘.'G'.'C'}包含的字符 不包含S中任一字符串 的字符串的种类数. 思路:首先对S建立ac自动机,考虑 ...

  2. etcd实现服务发现

    前言 etcd环境安装与使用文章中介绍了etcd的安装及v3 API使用,本篇将介绍如何使用etcd实现服务发现功能. 服务发现介绍 服务发现要解决的也是分布式系统中最常见的问题之一,即在同一个分布式 ...

  3. 透过面试题掌握HashMap【持续更新中】

    本文主要是自己阅读了HashMap和ConcurrentHashMap源码及一些Java容器类相关的博客后,找了一些很多面经中涉及到的Java容器相关的面试题,自己全部手写的解答,也花了一些流程图,之 ...

  4. 浅谈字典树Trie

    \(\;\) 本文是作者学习<算法竞赛进阶指南>的所得,有些语言是摘自其中. \(\;\) 基础知识 定义 \(\;\) 字典树(Trie):是一种支持字符串查询的多叉树结构.其中的每个节 ...

  5. 2018-06-17 js数组

    数组的定义:① var arr=new Array(xx,xx,xx); ②var arr=[yy,yy,,yy]; 数组的查看:arr[x]; 数组的修改:arr[x]=xx; 数组的遍历:①for ...

  6. 201843 2019-2020-2 《Python程序设计》实验二报告

    201843 2019-2020-2 <Python程序设计>实验二报告 课程:<Python程序设计> 班级: 1843 姓名: 李新锐 学号:20184302 实验教师:王 ...

  7. DIV+CSS布局的优势和弊端

    DIV+CSS的优势1.符合W3C标准.这保证您的网站不会因为将来网络应用的升级而被淘汰.2.对浏览者和浏览器更具亲和力.由于CSS富含丰富的样式,使页面更加灵活性,它可以根据不同的浏览器,而达到显示 ...

  8. 为什么Tableviewcell创建时可以不判空

    dequeueReuseableCellWithIdentifier:与dequeueReuseableCellWithIdentifier:forIndexPath:的区别: 前者不必向tableV ...

  9. 仙人掌图判定及求直径HDU3594 BZOJ1023

    https://wenku.baidu.com/view/ce296043192e45361066f575.html   //仙人掌图基础知识3个判定条件 http://blog.csdn.net/y ...

  10. vue脚手架3.0的安装与使用

    一.安装 1.先检查是否有安装vue  (vue-cli3需要node大于等于8.9版本) //vue -V 2.如果没安装跳过.安装有3.0以下的版本就的先卸载掉以前的版本 npm uninstal ...