【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

 

posted @ 2020-08-19 20:46  九州霜  阅读(194)  评论(3编辑  收藏  举报