Project Euler-002-偶斐波那契数列
#include <stdio.h>
#include <stdlib.h>
// 递归实现斐波那契数列
//int Fib(int a,int b){
// if (a == 1 || a == 2){
// return 1;
// }
// else{
// if ((Fib(a-1) + Fib(a-2))/2.0 == (Fib(a-1) + Fib(a-2))/2){
// b = b + Fib(a-1) + Fib(a-2);
// }
// return Fib(a-1) + Fib(a-2),b;
// }
//}
int main() {
printf("请输入您所要计算的项数(需大于0,小于四百万):");
int a = 1;
scanf("%d",&a); //输入项数
if(a<=0 || a>4000000) {
printf("输入非法,请重新输入!"); //保证输入范围在限定范围之内
return 0;
}
long long m = 1,n = 2,sum = 0 ; //用m,n来表示斐波那契数列的前两项
for (int i=1; i<=a; i++){
if (i == 1 || i == 2){ //因为在第26行代码中,斐波那契数列的第1,2两项数字已经被给定,此处跳过即可
continue ;
}
if(m<n){ //在m,n中比较小的那一个在被加之后没有用处,所以要选用小的数字覆盖成为新的大数
m = m + n;
if (m % 2 == 0){ //保证是偶数
sum = sum + m; //若是偶数即求和
}
}
else{
n = m + n; //同上
if (n % 2 == 0){
sum = sum + n; //同上
}
}
}
printf("前%d项偶斐波那契数列和为:%lld",a,sum);
return 0;
}
这道题没有什么快速的解法,只能是暴力循环求解。需要注意的一点是,当项数越靠后,他的这个位数就越大,非常容易超出int型的表示范围大小(int型可以粗略的记为-2x109~2x109)
像这个就已经远远超过int型的表示范围了,所以采用long long型的数据类型更为安全。long long型是C99标准里提出的,可能有部分编译器不支持。使用的时候一定要注意。
对了,当我们计算第400000,也就是题干里给定的最大的那一项时,其实long long也是溢出了,所以这时候应该采用其他方法的,但是由于自身水平和精力有限,所以今后在进行补充。