爬樓梯(升級版)
阿新 • • 發佈:2020-07-10
【題目描述】
假期時,TFLSOIers最喜歡的事情是到學校學習C++程式設計,糟糕的是學習程式設計的機房在11層,世界上最痛苦的事莫過於爬樓梯。假設爬到11層共有N個臺階,TFLSOIers從下往上爬樓梯,一步可以跨一級臺階,也可以跨兩級臺階。問:他們爬到第N個臺階有多少種走法?
【輸入格式】
一行一個整數n(n的取值範圍見下方提示,請認真分析)
【輸出格式】
一個整數,表示爬到第n級臺階有多少種走法。
【輸入樣例】
3
【輸出樣例】
3
【提示】
30%資料 1≤n≤45
30%資料46≤n≤91
40%資料92≤n≤100
根據分析可知,其實考查斐波那契數列數列,只是初始值有所變化,注意初始值的特判
一、20分程式碼:本題用遞迴寫的話會超時因為第3個測試點就是45,可模擬一下運算過程,會發現有很多重複運算,所有很耗時,正好提一下斐波那契數列的時間複雜度
1 #include<bits/stdc++.h> 2 using namespace std; 3 long long tj(int n){ 4 if(n==1)return 1; 5 if(n==2)return 2; 6 if(n>=3)return tj(n-1)+tj(n-2); 7 } 8 int main(){ 9 int n; 10 cin>>n;11 cout<<tj(n); 12 return 0; 13 }
二、30分程式碼:使用迴圈寫斐波那契,超過45就會超出int資料範圍
1 #include<iostream> 2 using namespace std; 3 int main() 4 { 5 6 int n, f1=1, f2=2, fn; 7 cin>>n; 8 if(n==1)fn=1;//注意加特判 9 if(n==2)fn=2;//注意加特判 10 for(int i=3; i<=n; i++)11 { 12 fn=f1+f2; 13 f1=f2; 14 f2=fn; 15 } 16 cout<<fn<<endl; 17 18 return 0; 19 }
三、60分程式碼:n超過91答案就會超出long long 資料範圍
1 #include<iostream> 2 using namespace std; 3 int main() 4 { 5 6 int n; 7 long long f1=1, f2=2, fn; 8 cin>>n; 9 if(n==1)fn=1; 10 if(n==2)fn=2; 11 for(int i=3; i<=n; i++) 12 { 13 fn=f1+f2; 14 f1=f2; 15 f2=fn; 16 } 17 cout<<fn<<endl; 18 19 return 0; 20 }
四、100分程式碼:40%資料要求使用高精度運算,也就是把上述方法結合高精度運算,要求靈活準確理解高精度。此題對於基礎不牢的同學一定要認真模擬,多加測試程式碼觀察程式碼執行情況。
1 #include<bits/stdc++.h> 2 using namespace std; 3 int f1[105], f2[105], ans[105]; 4 void inf(){ 5 f1[0]=1, f2[0]=2;//初始化相當於f1=1000000..., f2=2000000... 6 } 7 void fib(){ 8 int jw=0, i=0; 9 for(; i<=100; i++){ 10 int t=jw+f1[i]+f2[i]; 11 ans[i]=t%10; 12 jw=t/10; 13 } 14 ans[i]=jw;//jw值放在陣列最高位,別忘了 15 } 16 void change(int a[], int b[]){//相當於a=b;只不過封裝成一個函式 17 for(int i=0; i<=100; i++){ 18 a[i]=b[i]; 19 } 20 } 21 void output(int t[]){ 22 int l=100; 23 while(t[l]==0){ 24 l--; 25 }//從後往前去除前導0 26 for(int i=l; i>=0; i--)cout<<t[i]; 27 } 28 int main() 29 { 30 inf();//初始化相當於f1=1, f2=2 31 int n; 32 cin>>n; 33 if(n==1)output(f1); 34 else if(n==2)output(f2); 35 else { 36 for(int i=3; i<=n; i++){ 37 38 // output(f1);cout<<endl;//測試程式碼 39 // output(f2);cout<<endl;//測試程式碼 40 fib();//高精度求 ans=f1+f2 41 // output(ans); cout<<endl; //測試程式碼 42 change(f1,f2);//將f2賦值給f1相當於 f1=f2 43 change(f2,ans);//將f1賦值給 f2=ans 44 } 45 46 //輸出ans 47 output(ans); 48 49 } 50 51 return 0; 52 }
此題區分度很好,綜合了遞迴、陣列、高精度、演算法效率分析,可精講精練!
此題陣列作者自造,如有疑問可留言索取!