汉诺塔问题,BigInteger用法

余生颓废 提交于 2020-01-26 08:59:54
汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。 大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。 大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上(可以借助第三根柱子做缓冲)。 并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。 如图【1.jpg】是现代“山寨”版的该玩具。64个圆盘太多了,所以减为7个, 金刚石和黄金都以木头代替了…但道理是相同的。 据说完成大梵天的命令需要太多的移动次数,以至被认为完成之时就是世界末日! 你的任务是精确计算出到底需要移动多少次。 很明显,如果只有2个圆盘,需要移动3次。 圆盘数为3,则需要移动7次。 那么64个呢?
import java.math.BigInteger;

public class Main{
public static void main(String[] args) {
 BigInteger bi=new BigInteger("2");
 bi = bi.pow(64).subtract(BigInteger.ONE);
 System.out.println(bi);
}
}

BigInteger用法

(此方法本题中用于计算264-1,如果采用一般方法即a=Math.pow(2,64)-1,则会产生内存溢出

1.赋值
两种方法
BigInteger a=new BigInteger(“1”);
BigInteger b=BigInteger.valueOf(1);
2.运算
① add(); 大整数相加
BigInteger a=new BigInteger(“23”);
BigInteger b=new BigInteger(“34”);
a. add(b);//相当于a+b
②subtract(); 相减
③multiply(); 相乘
④divide(); 相除取整
⑤remainder(); 取余
⑥pow(); a.pow(b)=a^b
⑦gcd(); 最大公约数
⑧abs(); 绝对值
⑨negate(); 取反数
⑩mod(); a.mod(b)=a%b=a.remainder(b);

pl:BigInteger bi=new BigInteger(“2”);//赋值
bi = bi.pow(64).subtract(BigInteger.ONE);//意为2的64次方减1**

3.BigInteger构造函数
一般用到以下两种:
BigInteger(String val);
将指定字符串转换为十进制表示形式;
BigInteger(String val,int radix);
将指定基数的 BigInteger 的字符串表示形式转换为 BigInteger

4.基本常量
A=BigInteger.ONE 1
B=BigInteger.TEN 10
C=BigInteger.ZERO 0
5.n.compareTo(BigInteger.ZERO)0 //相当于n0
6.if(a[i].compareTo(n)>=0 &&a[i].compareTo(m)<=0) // a[i]>=n && a[i]<=m

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!