目录

1 问题描述

2 解决方案

2.1 从左至右二进制幂

2.2 从右至左二进制幂

 


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:
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

算法笔记_040:二进制幂(Java)的更多相关文章

  1. 算法笔记_018:旅行商问题(Java)

    目录 1 问题描述 2 解决方案 2.1 蛮力法 2.2 减治法 2.2.1 Johson-Trotter算法 2.2.2 基于字典序的算法   1 问题描述 何为旅行商问题?按照非专业的说法,这个问 ...

  2. 算法笔记_019:背包问题(Java)

    目录 1 问题描述 2 解决方案 2.1 蛮力法 2.2 减治法 2.2.1 递归求解 2.2.2 非递归求解(运用异或运算) 2.3 动态规划法 1 问题描述 给定n个重量为w1,w2,w3,... ...

  3. 算法笔记_015:快速排序(Java)

    目录 1 问题描述 2 解决方案 2.1 快速排序原理简介 2.2 具体编码 1 问题描述 给定一组数据,使用快速排序得到这组数据的非降序排列. 2 解决方案 2.1 快速排序原理简介 引用自百度百科 ...

  4. 算法笔记_230:运动员分组(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 有N个人参加100米短跑比赛.跑道为8条.程序的任务是按照尽量使每组的人数相差最少的原则分组.例如:N=8时,分成1组即可.N=9时,分成2组:一组 ...

  5. 算法笔记_136:交替字符串(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 输入三个字符串s1.s2和s3,判断第三个字符串s3是否由前两个字符串s1和s2交错而成且不改变s1和s2中各个字符原有的相对顺序. 2 解决方案 ...

  6. 算法笔记_010:插入排序(Java)

    1 问题描述 给定一组数据,使用插入排序得到这组数据的非降序排列. 2 解决方案 2.1 插入排序原理简介 引用自百度百科: 有一个已经有序的数据序列,要求在这个已经排好的数据序列中插入一个数,但要求 ...

  7. 算法笔记_039:杨辉三角形(Java)

    目录 1 问题描述 2 解决方案 1 问题描述 问题描述 杨辉三角形又称Pascal三角形,它的第i+1行是(a+b)i的展开式的系数. 它的一个重要性质是:三角形中的每个数字等于它两肩上的数字相加. ...

  8. 算法笔记_041:寻找和为定值的多个数(Java)

    目录 1 问题描述 2 解决方案 1 问题描述 输入两个整数n和sum,要求从数列1,2,3,...,n中随意取出几个数,使得它们的和等于sum,请将其中所有可能的组合列出来. 2 解决方案 上述问题 ...

  9. Java实现二进制幂

    1 问题描述 使用n的二进制表示,计算a的n次方. 2 解决方案 2.1 从左至右二进制幂 此方法计算a的n次方具体思想,引用<算法设计与分析基础>第三版一段文字介绍: package c ...

随机推荐

  1. BZOJ 3196 Tyvj 1730 二逼平衡树 树套树 线段树 treap

    http://www.lydsy.com/JudgeOnline/problem.php?id=3196 http://hzwer.com/2734.html 线段树套treap,似乎splay也可以 ...

  2. uoj117 欧拉回路

    题目描述: 有一天一位灵魂画师画了一张图,现在要你找出欧拉回路,即在图中找一个环使得每条边都在环上出现恰好一次. 一共两个子任务: 这张图是无向图.(50 分) 这张图是有向图.(50 分) 输入格式 ...

  3. Java高级架构师(一)第42节:应用上Nginx过后的体系结构

    以后的架构思考方向: 体系结构的演变

  4. Codeforces Beta Round #4 (Div. 2 Only) A. Watermelon 水题

    A. Watermelon 题目连接: http://www.codeforces.com/contest/4/problem/A Description One hot summer day Pet ...

  5. PAT甲级1026. Table Tennis

    PAT甲级1026. Table Tennis 题意: 乒乓球俱乐部有N张桌子供公众使用.表的编号从1到N.对于任何一对玩家,如果有一些表在到达时打开,它们将被分配给具有最小数字的可用表.如果所有的表 ...

  6. Shell基础学习(四) echo命令

    1.显示普通的字符串 echo "boring" 2.显示转义字符 echo "\"It is a test!\""; 3.read 命令从 ...

  7. 測试oracle 11g cluster 中OLR的重要性

     測试oracle 11g cluster 中OLR的重要性 called an Oracle Local Registry (OLR): each node in a cluster has a ...

  8. 掌握11项技能,你就是优秀的前端开发project师

    导读: 你或许会认为前端开发是一个非常easy的工作,对呀,你就是刚刚从网页设计转型过来的.但当你深入当中时,一定会发现好像前端开发不是那么简单,光站点性能优化.响应式.框架就让你焦头烂额, 确实,做 ...

  9. 跨域策略文件crossdomain.xml

    Web站点通过crossdomain.xml文件(放于站点根目录)配置提供允许的域跨域访问本域内容的权限 以土豆的为例: <cross-domain-policy> <allow-a ...

  10. .NET:动态代理的 “5 + 1” 模式

    背景 什么叫“动态代理”,代理模式我们都知道,动态代理就是动态生成的代理(采用Emit). 重量级的ORM和IOC产品离不开动态代理,作为开发人员,多数情况不用关注动态代理的内部实现机制,但是了解其一 ...