第一种暴力解法:
先估算f(n)数组的大小,f(n)>=
,估算可得数组开44项
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAX_N 44
#define MAX_M 4000000
int f[MAX_M+5];
int main(){
int n=2;
f[1]=1,f[2]=2;
while(f[n]+f[n-1]<MAX_M){
f[n+1]=f[n]+f[n-1];
n++;
}
long long sum=0;
for(int i=1;i<=n;i++){
if(f[i]%2)continue;
sum+=f[i];
}
printf("%lld\n",sum);
return 0;
}
第二种解法:指针交替,求和
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAX_N 4000000
int main(){
long long sum=2;
int a=1,b=2;//fib数列 0 1 2 3 5
while(a+b<MAX_N){
b=a+b;//第n项
a=b-a;//前一项
if(!(b&1))sum+=b;
}
printf("%lld",sum);
return 0;
}
第三种解法:滚动数组(空间优化)
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAX_N 4000000
int main(){
long long sum=2;
int f[3]={1,2};
int n=1;
while(f[n%3]+f[(n-1)%3]<MAX_N){
n++;
f[(n%3)]=f[(n-1)%3]+f[(n-2)%3];
if(!(f[n%3]&1))sum+=f[n%3];
}
printf("%lld",sum);
return 0;
}