传送门
P1096 [NOIP2007 普及组] Hanoi 双塔问题 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
思路
首先推方程
要考试有点懒,就抄借鉴一下单塔的思路
如果知道的话,可以推单塔递推公式是a[n]=a[n-1]*2+1(找个时间把单塔讲讲)
然后我们看这道题,不难看出
这题就是把n-1组圆盘放在柱2,再把n组圆盘放在柱3,最后把n-1组圆盘放在柱3
可推出a[n]=a[n-1]*2+n
只是要用高精度
看代码就彳亍了
代码
#include <bits/stdc++.h>
using namespace std;
const int N = 200;
int main() {
int n, a[210], k = N;
memset(a, 0, sizeof(a));
cin >> n;
//以下是高精度乘法与高精度加法,结果存于数组a中
for(int i = 1; i <= n; ++i) {
for(int j = 1; j <= k; ++j)
a[j] *= 2;
a[1]++;
for(int j = 1; j <= k; ++j)
if(a[j] >= 10) {
a[j + 1] += a[j] / 10;
a[j] %= 10;
}
}
for(int i = 1; i <= k; ++i)
a[i] *= 2;
for(int i = 1; i <= k; ++i)
if(a[i] >= 10) {
a[i + 1] += a[i] / 10;
a[i] %= 10;
}
for(; k > 0 && a[k] == 0; k--); //删0
for(int i = k; i >= 1; --i) {
cout << a[i]; //倒输
}
return 0;
}