前几天做了一道feibonaci的题
最后发现程序运行的时候老是报错,或者有各种各样的问题
所以去网上找了各种解法。
在这里,把自己的学习过程贴过来:
一、最sd,最蠢的做法,用递归,别笑我!
#include"stdio.h"
const int t = 1e9;
//int f[1000005]={};
int f(int x){
if(x==1||x==2)
return 1;
else
return (f(x-1)+f(x-2))%t;
}
int main(){
int x;
scanf("%d",&x);
printf("%d",f(x));
return 0;
}
这个程序蠢的地方在于,随便输一个大一点的数,然后编译运行下就会爆炸,感觉是递归的做法太占用内存了。但是数值不大的话还是可以得到正确的题解的额。
二、比一号优化过的二号,但是还是有不足
#include"stdio.h"
const int t = 1e9;
int f[1000005]={};
int main(){
int i,x;
scanf("%d",&x);
f[1]=f[2]=1;
for(i=3;i<=x;i++){
f[i]=(f[i-1]+f[i-2])%t;
}
printf("%d",f[x]);
return 0;
}
其实如果我不知道第三个的话,
只看这个感觉也基本差不多了,
只是和后面的第三个做法相比较
会显得二号也很蠢
三、在b站学到的绝活!芜湖起飞!
#include"stdio.h"
const int t=1e9;
int main(){ //时间复杂度非常优秀0.0
int i,x;
int a=1,b=1,c=1; //做初始化(c在这个题不需要?)
scanf("%d",&x); //屏幕输入获得一个数 做斐波那契序列的定位
for(i=3;i<=x;i++){ //从3进,因为f[1]=f[2]=1
c=(a+b)%t; //取余运算防止数据超界
//作数值的滚动
a=b; //2号变量的赋值给1号变量
b=c; //3号赋值给2号变量
}
printf("%d",c);
return 0;
}
这个的经典之处在于
1.不需要使用数组来存储数据
2.使用了滚动数值的概念(第一次看到感觉很有趣,以后估计也能用到)
3.很有意思呀
好了,又是平平淡淡的一天!