法1:
//1 1 2 3 5 8 13 21...
//求斐波那契数列的前40个数
#include <stdio.h>
int main(){
int f1=1,f2=1,f3; //斐波那契的关键在于,第一个数+第二个数=第三个数,所以我们设置三个变量来分别存放
// printf("%d\n",f1);
// printf("%d\n",f2);
printf("%d\n%d\n",f1,f2);
for(int i = 2; i<40; i++){
f3 = f1+ f2; //重点在于后移,让第一个数等于第二个,第二个等于第三个...
printf("%d\n",f3);
f1 = f2;
f2 = f3;
}
}
f3 = f1+f2;
f1 = f2;
f2 = f3;
这是方法1的关键语句。
注意!!第一次写的时候我将后两句的顺序写反了,这样会导致结果完全不一样。因为一开始我惯性思维了,想着一个一个后移,最先变的是f3,那我就再变f2,最后f1,这是一种理所当然的想法,没有任何推证,这种思维习惯很不好,希望大家不要学我。因为这种写法会导致的是:f2变成f3的值了之后再变的f1,此时f1得到的其实是变化后的f2,也是等于f3的,而不是等于f2先前的原始值。这样就完全不符合规律了。
注意顺序!!
法2
#include <stdio.h>
int main(){
int arr[40] = {1,1}; //创建一个有40个元素的数组,仅给前两项赋值
for(int i = 2; i <40; i++){
arr[i] = arr[i-1] + arr[i-2]; //对后面的值进行计算,后面的皆等于前两项之和
}
for(int k = 0; k<40 ; k++){ //打印
if(k%5==0) printf("\n"); //方便观察,每五个五个打印
printf("%d ",arr[k]);
}
}