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
Java实现二进制幂的更多相关文章
- 算法笔记_040:二进制幂(Java)
目录 1 问题描述 2 解决方案 2.1 从左至右二进制幂 2.2 从右至左二进制幂 1 问题描述 使用n的二进制表示,计算a的n次方. 2 解决方案 2.1 从左至右二进制幂 此方法计算a的n次 ...
- Java基础-二进制以及字符编码简介
Java基础-二进制以及字符编码简介 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 想必计算机毕业的小伙伴或是从事IT的技术人员都知道数据存储都是以二进制的数字存储到硬盘的.从事开 ...
- java十进制二进制互转
1. 十进制转二进制 原理:给定的数循环除以2,直到商为0或者1为止.将每一步除的结果的余数记录下来,然后反过来就得到相应的二进制了. 比如8转二进制,第一次除以2等于4(余数0),第二次除以2等于2 ...
- java基础 二进制补码
二进制补码: 1.计算机系统的内部以二进制形式存储数据. 2.在Java程序中输入的十进制的数据都会被自动转换为二进制,Java内部也以二进制来进行数值运算,但返回的结果是十进制. 二进制补码的原理: ...
- Java 算法-快速幂
1 什么是快速幂? 快速幂,顾名思义就是快速的求次幂,例如:a^b,普通的算法就是累乘,这样的计算方法的时间复杂度就是O(n),而快速幂的方法使得次幂的计算方法的时间复杂度降低到O(logn). 假 ...
- java:判断二进制数据中第n位是否为1
可以使用位运算来判断. &是位的与运算符,是指二进制数按位“与”的操作, 逻辑与就是两者都为真的时候才为真,其他真假,假真,假假的运算结果都是假.二进制写法如下 1 & 1 = 1 , ...
- Java:二进制(原码、反码、补码)与位运算
一.二进制(原码.反码.补码) 二进制的最高位是符号位(“0”代表正数,“1”代表负数): Java中没有无符号数: 计算机以整数的补码进行运算: 1. 原码:将一个整数转换成二进制表示 以 int ...
- java图片二进制相互转换
import java.awt.image.BufferedImage; import java.io.ByteArrayInputStream; import java.io.ByteArrayOu ...
- java中 二进制 八进制 十六进制 十进制 相互转换 最简方法
package com.swift; import java.util.Scanner; public class Hex2Decimal { public static void main(Stri ...
随机推荐
- [hdu5400 Arithmetic Sequence]预处理,容斥
题意:http://acm.hdu.edu.cn/showproblem.php?pid=5400 思路:预处理出每个点向左和向右的最远边界,从左向右枚举中间点,把区间答案加到总答案里面.由与可能与前 ...
- Python脚本:实现对象集合List导入到excel表格,支持mysql,postergrsql,MongoDB
import xlwt import os import datetime #验证export_filed中的字段是否在对象字段中 def checkField(obj_list,filed_dict ...
- Unity直接调用Android Toast
Unity直接调用Android Toast 这两天在搭一套UI框架,想把Android的Toast直接集成上去,有不想直接打jar包,所有写了个C#直接调用,废话不多说,直接干货: using Un ...
- 【数论基础】素数判定和Miller Rabin算法
判断正整数p是否是素数 方法一 朴素的判定
- Python单元测试框架:pytest
(一)介绍 pytest是一个非常成熟的全功能的Python测试框架,主要特点有以下几点: 1.简单灵活,容易上手: 2.支持参数化: 3.能够支持简单的单元测试和复杂的功能测试,还可以用来做sele ...
- Scrapy 框架 入门教程
Scrapy入门教程 在本篇教程中,我已经安装好Scrapy 本篇教程中将带您完成下列任务: 创建一个Scrapy项目 定义提取的Item 编写爬取网站的 spider 并提取 Item 编写 Ite ...
- ASHRAE KAGGLE大能源预测(前三名方案总结+相关知识点讲解+python实现)
@ 目录 1 概述 2 处理思想学习 2.1 移除异常值 2.2 缺失值 2.3 目标函数 2.4 特征工程 2.4.1 Savitzky-Golay filter 2.4.2 Bayesian ta ...
- poj3680 最大权不相交路径
Intervals Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 8587 Accepted: 3662 Descrip ...
- HDU2819
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2819 题目大意: 给出一个N*N的0/1矩阵,只能交换整行或者整列,问最少交换多少次可以变成一个主对角 ...
- Poj1753 翻转棋子
这个题就是用枚举举遍所有情况,然后一个一个深搜看看是不是符合条件,符合条件直接退出,不符合则继续, 由于表格只有16个所以可以得知最多的步数只能是16,所以可以根据步数从0到16依次枚举, 第一个符合 ...