汉诺塔计数 实现输出64个圆盘移动多少次 java代码
2014-03-18 13:53
344 查看
因为汉罗塔的个数如果为1,2,3,4;那么对应的移动次数为1,3,7,15相当于2^n-1,也可以说是上一次的结果乘以2加上1就是下一次的结果
由于当汉罗塔多了之后后面的数字会很大,有可能java的类型无法支持如此大的数,也为了可以快速高效的计算出结果,此时就不能用一般的方法统计,这里我采用的是通过数组的方式实现叠加统计
例如:a[] = {0,0,1,4}表示4位数,结果是14 如果要当其中某一位出现大于10的就向前一位进1,例如{0,2,23,11,3}得出的结果实际上应该是{0,4,4,1,3}:4413
如果这个数需要乘以一个数那么就和每一位上的相乘最后进位,例如:{0,6,2}*2={0,12,4}={1,2,4}=124这样的道理
最后用一个字符串来得出最后的结果数字就可以了
下面的程序a[]表示用于统计的结果,是一个字符串数组,b[]表示上一个的结果数组,c[]表示乘以2减去1后的结果数组
最后结果:总共64个圆盘共移动了:18446744073709551615次
由于当汉罗塔多了之后后面的数字会很大,有可能java的类型无法支持如此大的数,也为了可以快速高效的计算出结果,此时就不能用一般的方法统计,这里我采用的是通过数组的方式实现叠加统计
例如:a[] = {0,0,1,4}表示4位数,结果是14 如果要当其中某一位出现大于10的就向前一位进1,例如{0,2,23,11,3}得出的结果实际上应该是{0,4,4,1,3}:4413
如果这个数需要乘以一个数那么就和每一位上的相乘最后进位,例如:{0,6,2}*2={0,12,4}={1,2,4}=124这样的道理
最后用一个字符串来得出最后的结果数字就可以了
下面的程序a[]表示用于统计的结果,是一个字符串数组,b[]表示上一个的结果数组,c[]表示乘以2减去1后的结果数组
public class 汉罗塔计数 { // N为多少个圆盘 public static int N = 64;//这里可以自己修改 /** * 处理结果 * @param a 得到的每一次运算的结果数组 * @param c 得到当前移动的次数的数组(也就是上一次的结果) * @param n 递归次数的变量 */ public static void processResult(String a[], int c[], int n) { //首先判断递归次数是否小于制定的汉罗塔的个数-1(n从0开始的) if (n < N - 1) { for (int i = 0; i < N; i++) { if (c[i] == 0) {//如果前面为0表示不是第一位:例如0014=14,不需要0 continue; } else { //取出这个数字放入a中 for (int j = i; j < N; j++) { a[n + 1] += String.valueOf(c[j]); } break; } } //如果是最后一次计数,则输出结果,直接结束方法 if (n == a.length - 2) { System.out.println("总共" + N + "个圆盘共移动了:" + a[n + 1] + "次"); return; } //继续递归 processResult(a, getLastResult(a, c, n + 1), n + 1); } } /** * 获取上一个结果 * @param a * @param c * @param n * @return */ public static int[] getLastResult(String a[], int c[], int n) { //b用于获取上一次的结果 int b[] = new int ; //先把字符串转变为一个个字符然后放入数组中 char[] t = a .toCharArray(); for (int i = 0; i < t.length; i++) { b[t.length - 1 - i] = t[i] - '0'; } //每个数字乘以2再放入c[]中 for (int i = 0; i < t.length; i++) { c[N - 1 - i] = b[i] * 2; } c[N - 1]++;//加1 //进行进位处理 for (int i = N - 1; i > 0; i--) { if (c[i] >= 10) { c[i - 1] += c[i] / 10; c[i] %= 10; } } return c; } public static void main(String[] args) { //初始化a String a[] = new String ; if (N == 1) { System.out.println("总共1个圆盘共移动了:1次"); } else { for (int i = 0; i < a.length; i++) { a[i] = ""; } int c[] = new int ; a[0] = "1";//如果不是一个圆盘,那么a[0]的结果是1 //开始处理结果 processResult(a, getLastResult(a, c, 0), 0); } } }
最后结果:总共64个圆盘共移动了:18446744073709551615次
相关文章推荐
- java笔记--代码实现汉诺塔移动过程和移动次数
- java代码--------实现随机输出100个随机数,10行,0--到9的数字
- 【转载】Java实现文件夹的移动、内容复制、删除代码
- 自定义实现InputFormat、OutputFormat、输出到多个文件目录中去、hadoop1.x api写单词计数的例子、运行时接收命令行参数,代码例子
- java 实现输出随机图片实例代码
- 输出一个集合的所有子集合-Java代码实现(一)
- java代码实现输出指定以.java结尾的文件的绝对路径
- java实现输出文件夹下某个格式的所有文件实例代码
- java中,父类是抽象类不能通过工厂输出时,如何通过其他类实现输出的示例代码(工厂方法种类(1))
- 用Java 编一段代码,实现在控制台输入一组数字后,排序后在控制台输出
- java代码实现点击鼠标从控制台输出信息
- Java实现文件夹的复制、移动、删除代码
- Java-十种内部排序实现(选择,冒泡,插入,希尔,堆,归并,快速,基数,计数,桶)及代码下载
- java代码实现输出指定以.java结尾的文件的绝对路径
- 实现 java 执行 cmd 命令,打印输出,等待cmd 完全执行完成后才执行下面代码
- java代码实现移动文件以及文件夹
- java代码--实现随机输出10个随机数,并显示最大值,最小值
- 利用Timer类实现字符串移动代码 java
- 字符串计数-复杂的动态规划题 解析以及Java代码实现
- java代码,实现输入编号,输出对应水果的单价~~~~