汉诺双塔 (高精度)

Posted xxrll

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了汉诺双塔 (高精度)相关的知识,希望对你有一定的参考价值。

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

 

以上是关于汉诺双塔 (高精度)的主要内容,如果未能解决你的问题,请参考以下文章

[DP][高精][NOIP]Hanoi双塔问题

b161: NOIP2007 4.Hanoi双塔问题

GLSL-片段着色器不同部分的精度不同

PHP 精度计算引发的灾难性Bug

1049 数列的片段和(注意精度!!)

论文|从DSSM语义匹配到Google的双塔深度模型召回和广告场景中的双塔模型思考