1. 程式人生 > 實用技巧 >【TFLSnoi李志帥】第⑩篇文章---爬樓梯(加強版)

【TFLSnoi李志帥】第⑩篇文章---爬樓梯(加強版)

這是我到現在為止都沒寫出來滿分程式碼的一道題

上次考試的壓軸題目

【題目描述】

假期時,TFLSOIers最喜歡的事情是到學校學習C++程式設計,糟糕的是學習程式設計的機房在11層,世界上最痛苦的事莫過於爬樓梯。假設爬到11層共有N個臺階,TFLSOIers從下往上爬樓梯,一步可以跨一級臺階,也可以跨兩級臺階。問:他們爬到第N個臺階有多少種走法?

【輸入格式】

一行一個整數n(n的取值範圍見下方提示,請認真分析)

【輸出格式】

一個整數,表示爬到第n級臺階有多少種走法。

【輸入樣例】

3

【輸出樣例】

3

【提示】

30%資料 1≤n≤45

30%資料46≤n≤91

40%資料92≤n≤100

根據分析可知,其實考查斐波那契數列數列,只是初始值有所變化,注意初始值的特判

我寫的60分程式碼:

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 int main()
 4 {
 5     long long a[1005],n;
 6     a[1]=1;a[2]=2;
 7     cin>>n;
 8     for(int i=3;i<=n;i++){
 9         a[i]=a[i-1]+a[i-2];
10     }
11     cout<<a[n];
12     return
0; 13 }

但是當我嘗試把它改成高精度的時候才發現。。。這太難了!!!我寫不出來!!!

所以嘛。。。

我決定copy一下老師的滿分程式碼,經常研究研究

老師的100分程式碼:

 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 }

相關連結:https://www.cnblogs.com/tflsnoi/p/13277386.html