欧拉50题-----第二题

在这里插入图片描述
第一种暴力解法:
先估算f(n)数组的大小,f(n)>= 1. 5 n 1.5^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;
}

猜你喜欢

转载自blog.csdn.net/weixin_43667631/article/details/92560505