汉诺双塔 (高精度)

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 }
View Code

猜你喜欢

转载自www.cnblogs.com/XXrll/p/10225376.html