1. 程式人生 > >初識高精度之P1096 HanoiHanoiHanoi雙塔問題

初識高精度之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;
}

這道題真的不錯,學到了很多東西