1. 程式人生 > 實用技巧 >爬樓梯(升級版)

爬樓梯(升級版)

【題目描述】

假期時,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 }

此題區分度很好,綜合了遞迴、陣列、高精度、演算法效率分析,可精講精練!

此題陣列作者自造,如有疑問可留言索取!