汉诺双塔 (高精度)

本文介绍了一种使用高精度计算解决汉诺塔问题的方法,通过数组存储每一位数,实现大数运算,解决了传统计算方法在面对大量数据时的局限性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

 

转载于:https://www.cnblogs.com/XXrll/p/10225376.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值