HDOJ2041_超級樓梯(斐波拉契數列)
阿新 • • 發佈:2019-03-01
第一次用 info sign png image printf sig can turn
正常簡單題:通過仔細觀察推斷即可看出這是一個斐波拉契數列的題目。
HDOJ2041_超級樓梯
在做這題的時候我誤入了思維盲區,只想著什麽方法可以解決,沒有看出是斐波拉契數列。因此第一次用組合數方法打了一次但是WA了,過程中我發現了WA的真正細節(整形數超過範圍)還算是有所收獲的。
組合數求和解
(WA:因為會炸範圍導致M稍微大一些答案就錯了)
#include<stdio.h> #include<stdlib.h> #include<math.h> #include<string.h> int main() { int n,i,j,steps; scanf("%d",&n); for(i=0;i<n;i++) { unsigned long long sum=0; scanf("%d",&steps); int max2=(steps-1)/2;//表示最多可以走多少步一次跨兩級階梯 //循環遍歷每一種方法中走0次,1次兩階梯,2次,3次... for(j=0;j<=max2;j++) { int n1=steps-1-2*j;//改方法中走了多少次跨兩級階梯 int n2=j;//該方法中走了多少次跨兩級階梯 int stp=n1+n2; //計算C(n1+n2,n2)組合數然後疊加即可 int p,q; int sum1=1,sum2=1; for(p=1;p<=n2;p++) { sum1*=(stp--); sum2*=p; } sum+=sum1/sum2; } printf("%lld\n",sum); } return 0; }
錯誤警示:
在對比用斐波拉契數列找出為什麽會出錯的時候,我隨意輸入了一串階梯進行對比,發現在20之前的答案是一致的,但是當M=30時,就出錯了,仔細思考意識到代碼中使用了累乘,那麽整形顯然是會爆炸的最後,自然就得不到正確的答案了。計算器摁了一下1乘到13就達到6227020800了,後面炸不炸顯而易見。效果如下圖
正解
錯解
斐波拉契數列求解
觀察可得f(1)=0;f(2)=1;f(3)=2;
f(n)=f(n-2)+f(n-1);(n>3時),這是一道利用斐波拉契數列解的題目。上代碼
#include<stdio.h> #include<stdlib.h> #include<math.h> #include<string.h> int fe[50]={0}; int main() { int i,j,n; int steps; fe[1]=0;fe[2]=1;fe[3]=2; for(i=4;i<=41;i++) { fe[i]=fe[i-1]+fe[i-2]; } scanf("%d",&n); for(i=1;i<=n;i++) { scanf("%d",&steps); printf("%d\n",fe[steps]); } return 0; }
HDOJ2041_超級樓梯(斐波拉契數列)