【欧拉计划】Q6:Even Fibonacci numbers

Even Fibonacci numbers


  • 递推与递归

Each new term in the Fibonacci sequence is generated by adding the previous two terms. By starting with 1 and 2, the first 10 terms will be:

1, 2, 3, 5, 8, 13, 21, 34, 55, 89, …

By considering the terms in the Fibonacci sequence whose values do not exceed four million, find the sum of the even-valued terms.

1.利用数组求fib数列

  1. 开一个足够大的数组,并初始化前两项1,2
  2. 通过递推法逐个将斐波那契数列的每一项存入数组
  3. 将所有为偶数的项的数字相加
#include<iostream>
using namespace std;

long long num[4000005] = {1, 2};

int main(){
    long long sum = 0;
    int i = 2;
	//1.利用递推法求出斐波那契数列的每一项,并存入数组中
    while(num[i - 1] <= 4000000){
        num[i] = num[i - 1] + num[i - 2];
        i++;
    }
    //2.对数组每一项进行判断,若为偶数将其加入sum中
    for(int j = 0; j < i; j++){
        if(num[j] % 2 == 0){
            sum += num[j];
        }
    }
    cout << sum; 
    return 0;
}
//空间复杂度:O(n)

2.两个变量求fib数列

  1. 不需要定义数组,在运算的过程中就可以知道哪些项是偶数
  2. 计算过程中只保留两个数字:前一个数 和 后一个数,两个数循环相加即可
#include <iostream>
using namespace std;

int main(){
    long long ans = 0;
    int a = 1, b = 2;
    
    while(b < 4000000){
        //1.在运算过程中就可以进行奇偶判断
        if(b % 2 == 0){
        	ans += b;
    	}
        //2.通过两个变量表示斐波那契数列两个数字
    	b = b + a;
        a = b - a;
    }
    cout << ans << endl;
    return 0;
}
//空间复杂度:O(1)

3.总结:

相对于方法1,方法2同时正向、反向利用了斐波那契数列项之间的关系,

从而避免了开辟数组空间,减小了算法的空间复杂度。在关于斐波那契数列的问题时要灵活运用项之间的关系

while(b < 4000000){
    if (b % 2 == 0) ans += b;
    b = b + a;
    a = b - a;
}
while(b < 4000000){
    if (b % 2 == 0) ans += b;
    b = b + a;
    swap(a, b);
}

tips:文章部分内容参考算法刷题课程,题解图示内容及代码根据老师课程、以及自己对知识的理解,进行二次整理和部分补充,仅供学习参考使用,不可商业化。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值