汉诺双塔 (高精度)
https://www.luogu.org/team/show?teamid=2961
由普通汉诺塔问题,设数量为n时移动次数为a[n],则a[n]=a[n-1]+1+a[n-1]=2*a[n-1]+1. // 因为a[1]=1,所以a[n]=2^n-1.(找规律?) 故双塔就是2*(2^n-1).---》但这里没用到
因为数据忒大,所以得用高精度。// 这里参考了别人的
思路就是用数组来存储每一位数。
1 #include<iostream> 2 #include<algorithm> 3 #include<cstdio> 4 #include<cstring> 5 #include<cmath> 6 #include<queue> 7 #include<stdlib.h> 8 #define mem(a) memset(a,0,sizeof(a)) 9 using namespace std; 10 int f[200]; 11 int main() 12 { 13 int n; 14 cin>>n; 15 f[1]=1; 16 for(int i=2;i<=n;i++) 17 { 18 for(int k=1;k<=i-1;k++) 19 f[k]*=2; //越低位的数乘2的次数越多,因为公式就是前一项*2,在“递归”到再前一项 20 for(int k=1;k<=i-1;k++) 21 if(f[k]>=10) //进位 22 { 23 f[k]-=10; 24 f[k+1]++; 25 } 26 f[1]++; 27 } 28 for(int i=1;i<=200;i++) //双塔的*2 29 f[i]*=2; 30 for(int i=1;i<=200;i++) 31 if(f[i]>=10) 32 { 33 f[i]-=10; 34 f[i+1]++; 35 } 36 int m=200; 37 while(f[m]==0) //找到最高位 38 m--; 39 for(int i=m;i>=1;i--) 40 cout<<f[i]; 41 return 0; 42 }