您的位置:首页 > 编程语言 > Java开发

汉诺塔计数 实现输出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后的结果数组
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次
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐