初识高精度之P1096 HanoiHanoiHanoi双塔问题

这道题是一道用来练习递推的经典题目,但是在推出递推关系式,满心欢喜将代码提交后只通过了四组数据,i can’t believe that;马上溜去看题解,嗯,一个大牛说这是道水题(没毛病),用高精度提交就可以了。。。。
高精度???我就乖乖滚去百度了
题目如下

题目描述

给定AAA、BBB、CCC三根足够长的细柱,在AAA柱上放有2n2n2n个中间有孔的圆盘,共有nnn个不同的尺寸,每个尺寸都有两个相同的圆盘,注意这两个圆盘是不加区分的(下图为n=3n=3n=3的情形)。

现要将这些圆盘移到CCC柱上,在移动过程中可放在BBB柱上暂存。要求:
不错的图片
(1)每次只能移动一个圆盘;

(2)AAA、BBB、CCC三根细柱上的圆盘都要保持上小下大的顺序;

任务:设AnA_nAn​为2n2n2n个圆盘完成上述任务所需的最少移动次数,对于输入的nnn,输出AnA_nAn​。
输入输出格式
输入格式:

一个正整数nnn,表示在AAA柱上放有2n2n2n个圆盘。

输出格式:

一个正整数, 为完成上述任务所需的最少移动次数AnA_nAn​。

输入输出样例
输入样例#1: 复制

【输入样例1】
1
【输入样例2】
2

输出样例#1: 复制

【输出样例1】
2
【输出样例2】
6

说明

【限制】

对于50%50%50%的数据,1≤n≤251 \le n \le 251≤n≤25

对于100%100%100%的数据,1≤n≤2001 \le n \le 2001≤n≤200

【提示】

设法建立AnA_nAn​与An−1A_{n-1}An−1​的递推关系式。
当塔有n种不同尺寸圆盘时,可以将移动过程分为三步;上边的n-1种圆盘移到B;这一步需要移动A(n-1)次,然后第二步将最大尺寸的圆盘移动到C,此步需要移动两次;最后一步将B的n-1种圆盘放到C,这一步需要移动的次数为A(n-1);三次移动共2A(n-1)+2次;即A(n)=2A(n-1)+2;
做到这儿此题算是解决了一半;
剩下的就是高精度算法了
将超过long long 范围的数字储存进数组里,通过模仿手算的方法对数组进行操作;

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int main()
{
	int a[200];
	int n;
	memset(a,0,sizeof(a));//将数组全部归零,以便判断大数的最高位
	cin>>n;
	a[1]=2;
	for(int i=2;i<=n;i++)
	{
		for(int j=1;j<i;j++)
		{
			a[j]*=2;
		}
  		for(int j=1;j<i;j++)
		{
			while(a[j]>=10)
			{
				a[j]-=10;
				a[j+1]+=1;
			}
		}
		a[1]+=2;
		while(a[1]>=10)
		{
			a[1]-=10;
			a[2]++;
		}
	}
	int k=100;//判断大数的最高位
	while(a[k]==0)
	{
		k--;
	}
	for(int i=k;i>0;i--)
		cout<<a[i];
	return 0;
}

这道题真的不错,学到了很多东西

猜你喜欢

转载自blog.csdn.net/lemail0406/article/details/84103528