初識高精度之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;
}
這道題真的不錯,學到了很多東西