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. 可能会导致.NET内存泄露的8种行为

    原文连接:https://michaelscodingspot.com/ways-to-cause-memory-leaks-in-dotnet/作者 Michael Shpilt.授权翻译,转载请保 ...

  2. LeetCode 31. 下一个排列 | Python

    31. 下一个排列 题目 实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列. 如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列). 必须原地修改, ...

  3. 黑马程序员_毕向东_Java基础视频教程——位运算符(随笔)

    位运算符 左移和右移 左移 左移越移越大. 往左移几位就相当于这个数乘于2的几次方 3 << 2 --> 3 * 2^2 = 3 * 4 = 12 3 << 3 --&g ...

  4. mybatis 自动生成代码工具

    配置官网: http://www.mybatis.org/generator/configreference/xmlconfig.html 源码:https://github.com/mybatis/ ...

  5. 「从零单排HBase 12」HBase二级索引Phoenix使用与最佳实践

    Phoenix是构建在HBase上的一个SQL层,能让我们用标准的JDBC APIs对HBase数据进行增删改查,构建二级索引.当然,开源产品嘛,自然需要注意“避坑”啦,阿丸会把使用方式和最佳实践都告 ...

  6. async/await的语法和使用

    1. async 函数     (1)函数的返回值为promise对象     (2)promise对象的结果由async函数执行的返回值决定 2. await 表达式     (1)await右侧的 ...

  7. Sentinel源码解析一(流程总览)

    引言 Sentinel作为ali开源的一款轻量级流控框架,主要以流量为切入点,从流量控制.熔断降级.系统负载保护等多个维度来帮助用户保护服务的稳定性.相比于Hystrix,Sentinel的设计更加简 ...

  8. 你不知道的事---SringCloud的feign的继承特性

    前言 说起SpringChoud的feign大家用过的都说好.Feign是Netflix开发的声明式.模板化的HTTP客户端.对于我们微服务来说,微服务之间的api调用,使用feign来说是再方便不过 ...

  9. 使用Html5对图片加水印及多图合成

                                                                             转载请注明原地址:                   ...

  10. ajax提交可以上传文件的form表单

    var formData = new FormData($( "#fm")[0]);       $.ajax({            url: 'webnavigationcw ...