正常簡單題:經過仔細觀察推斷便可看出這是一個斐波拉契數列的題目。php
在作這題的時候我誤入了思惟盲區,只想着什麼方法能夠解決,沒有看出是斐波拉契數列。所以第一次用組合數方法打了一次可是WA了,過程當中我發現了WA的真正細節(整形數超過範圍)還算是有所收穫的。code
(WA:由於會炸範圍致使M稍微大一些答案就錯了)blog
#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了,後面炸不炸顯而易見。效果以下圖get
觀察可得f(1)=0;f(2)=1;f(3)=2;string
f(n)=f(n-2)+f(n-1);(n>3時),這是一道利用斐波拉契數列解的題目。上代碼io
#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; }