LFYZ-OJ ID: 1011 hanoi双塔问题
思路
虽然每种大小盘子数量为2,但对总步数的影响只是一个简单的倍数关系而已,递推关系很容易可以总结出来:an=an-1+2+an-1=2(an-1+1),n=1时,a1=2。故递推的过程就是从a1=2开始每次先加1,再乘2。
因递推步骤较长(1~200),一定需要高精度运算,按照每次乘2估算,210=1024,即103,当递推200次时,则最大位数会有1000200/10=1060,所以最大数位大约为60位,设置个大小为100的数组来存储高精度数已绰绰有余。
可以将程序的实现划分为几个功能函数:
print()输出高精度数字,jia1()高精度数字+1,cheng2()高精度数字乘2。
例程1
#include<iostream>
using namespace std;
int an[100]; //存储an, a[0]为位数
void print(){ //高精度数字输出函数
for(int i=an[0]; i>=1; i--) printf("%d", an[i]);
}
void jia1(){ //高精度数字+1
int i=1, jw=0;
an[1]+=1; //最低位+1
do{ //进位处理
an[i]=an[i]+jw;
jw=an[i]/10;
an[i]%=10;
i++;
}while(jw);
if(an[an[0]+1]) an[0]++;
}
void cheng2(){ //高精度数字*2
int i, jw;
for(i=1, jw=0; i<=an[0]; i++){
an[i]=an[i]*2+jw;
jw=an[i]/10;
an[i]%=10;
}
if(jw) { an[i]=jw; an[0]=i; }
}
int main(){
int n;
scanf("%d", &n);
an[0]=1, an[1]=2; //将an按照a1来初始化:a1=2;
for(int i=2; i<=n; i++){
jia1(); //+1
cheng2(); //*2
}
print();
}
例程2
*例程2的思路是先按位乘2,再在最低位+2,然后统一处理进位,这样就有效减少了代码量。
#include<cstring>
#include<iostream>
using namespace std;
int f[300],n;
void oper(){
int i;
for (i=1;i<=f[0];i++) f[i]*=2; //按位×2
f[1]+=2; //最低位+2
for (i=1;i<=f[0];i++){ //统一处理进位
f[i+1]+=f[i]/10;
f[i]%=10;
}
if (f[f[0]+1]!=0) f[0]++; //确定位数
}
int main(){
cin>>n;
memset(f,0,sizeof(f)); //这行不需要,全局的会自动初始化为0
f[0]=1; f[1]=2; //f初始化为a1=2;
for(int i=2;i<=n;i++)
oper();
for(int i=f[0];i>=1;i--) //输出结果
cout<<f[i];
cout<<endl;
return 0;
}
LFYZ-OJ ID: 1011 hanoi双塔问题的更多相关文章
- noip普及组2007 Hanoi双塔问题
Hanoi双塔问题 描述 给定A,B,C三根足够长的细柱,在A柱上放有2n个中间有孔的圆盘,共有n个不同的尺寸,每个尺寸都有两个相同的圆盘,注意这两个圆盘是不加区分的.现要将这些圆盘移到C柱上,在移动 ...
- Hanoi双塔问题(递推)
Hanoi双塔问题 时间限制: 1 Sec 内存限制: 128 MB提交: 10 解决: 4[提交][状态][讨论版][命题人:外部导入] 题目描述 给定A,B,C三根足够长的细柱,在A柱上放有2 ...
- 洛谷 P1096 Hanoi双塔问题
P1096 Hanoi双塔问题 题目描述 给定A.B.C三根足够长的细柱,在A柱上放有2n个中间有孔的圆盘,共有n个不同的尺寸,每个尺寸都有两个相同的圆盘,注意这两个圆盘是不加区分的(下图为n=3的情 ...
- b161: NOIP2007 4.Hanoi双塔问题
zerojudge 汉诺塔?图片问度娘 b161: NOIP2007 4.Hanoi双塔问题 题目: 给定A.B.C三根足够长的细柱,在A柱上放有2n个中间有孔的圆盘,共有n个不同的尺寸,每个尺寸都 ...
- [高精度]P1096 Hanoi 双塔问题
Hanoi 双塔问题 题目描述 给定A.B.C三根足够长的细柱,在A柱上放有2n个中间有孔的圆盘,共有n个不同的尺寸,每个尺寸都有两个相同的圆盘,注意这两个圆盘是不加区分的(下图为n=3的情形). 现 ...
- hanoi双塔
汉诺塔,经典的递归. 经典的汉诺塔游戏相信很多同学都会玩的,规则就不用赘述,百科一下就OK.有三个柱子A,B,C,A柱子上套有n个大小不等的盘子,任意两个盘子,上面的盘子一定小于下面的盘子.现在请你编 ...
- 洛谷——P1096 Hanoi双塔问题
https://www.luogu.org/problem/show?pid=1096 题目描述 给定A.B.C三根足够长的细柱,在A柱上放有2n个中间有孔的圆盘,共有n个不同的尺寸,每个尺寸都有两个 ...
- 【NOIP2007】Hanoi双塔问题
题目描述 给定A.B.C三根足够长的细柱,在A柱上放有2n个中间有孔的圆盘,共有n个不同的尺寸,每个尺寸都有两个相同的圆盘,注意这两个圆盘是不加区分的(下图为n=3的情形). 现要将这些圆盘移到C柱上 ...
- 【题解】Hanoi双塔问题
题目描述 给定A,B,C三根足够长的细柱,在A柱上放有2n个中间有空的圆盘,共有n个不同的尺寸,每个尺寸都有两个相同的圆盘,注意这两个圆盘是不加区分的(下图为n=3的情形).现要将这些圆盘移到C柱上, ...
随机推荐
- Arch Linux安装Firefox 火狐中文版
很多人刚安装好系统之后,刚开始内置的浏览器是火狐的英文版,很多时候因为需要账号同步的原因需要国内版本的火狐浏览器,这个时候我们应该怎么操作呢? 其实也非常的简单 首先我们 输入命令 pacman -S ...
- ASP.NET基础知识汇总之WebConfig各节点介绍
web.config虽然一直用,接触最多的也就是节点appSettings和connectionSettings,今天系统的梳理一下,了解一下webconfig各个节点的含义,先简单的浏览一下具体的w ...
- rm: cannot remove ‘overlay/’: Device or resource busy
umount /var/lib/docker/overlay #取消挂载就可以啦 rm -rf overlay/
- ✔ OI Diary ★
一 | 2019-3-28 1.整晨,云之考矣,暴后皆不会,邃无感而写斯普雷尔,然则午后知暴可六十哉. 然则斯普雷毙,虽特判之矣,然则暴只判二十哉,呜呼! 2.午间归宿,视白购书一本,目触,感之甚集 ...
- matlab读取csv文件数据并绘图
circle.m(画二维圆的函数) %该函数是画二维圆圈,输入圆心坐标和半径%rectangle()函数参数‘linewidth’修饰曲线的宽度%'edgecolor','r',edgecolor表示 ...
- Abp vNext 切换MySql数据库
Abp vNext是Abp的下一代版本,目前还在经一步完善,代码已经全部重写了,好的东西保留了下来,去除了很多笨重的东西,从官宣来看,Abp vNext主要是为了以后微服务架构而诞生的. 从源码来看, ...
- Neutron flat network 学习
flat network 是不带 tag 的网络,要求宿主机的物理网卡直接与 linux bridge 连接,这意味着: 每个 flat network 都会独占一个物理网卡. 在 ML2 配置中 ...
- SpringCloud学习笔记:熔断器Hystrix(5)
1. Hystrix简介 在分布式系统中,服务与服务之间相互依赖,一种不可避免的情况是某些服务会出现故障,导致依赖于它们的其他服务出现远程调度的线程阻塞. Hystrix提供熔断器功能,能够阻止分布式 ...
- Java垃圾收集器概述
垃圾收集器的操作 查找未使用的对象,释放内存,并压缩堆,避免内存碎片 一个java程序,有执行应用程序逻辑的线程和执行GC的线程组.当GC跟踪对象引用,或在内存中移动对象,它必须确保应用程序线程没有使 ...
- Lodop、c-lodop注册与角色简短问答
注册与角色:参考http://www.c-lodop.com/demolist/t1.html参考链接里的三种场景,是哪种角色.客户端访问网站后用自己的打印机打印.是客户端本地打印角色.IP和域名注册 ...