这是我到现在为止都没写出来满分代码的一道题
上次考试的压轴题目
【题目描述】
假期时,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