【欧拉计划第 2 题】 偶数斐波那契数 Even Fibonacci numbers

简介: 【欧拉计划第 2 题】 偶数斐波那契数 Even Fibonacci numbers

Problem 2 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.

问题 2 偶数斐波那契数

斐波那契数列中的每个新项都是通过添加前两项来生成的。从 1 和 2 开始,前 10 个术语将是:

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

通过考虑斐波那契数列中值不超过四百万的项,求偶数项之和。

思路分析

斐波那契数列

首先清楚什么是斐波那契数列

斐波那契数(Successione di Fibonacci),又译为菲波拿契数、菲波那西数、斐氏数、黄金分割数。所形成的数列称为斐波那契数列

数学定义

数学上,使用递归的方法定义

通俗来讲,斐波那契数列由 0(第零项) 和 1 开始,之后的斐波那契数由之前的两数相加得出,举例

1、 1、 2、 3、 5、 8、 13、 21、 34、 55、 89、 144、 233、 377……

解题报告

常规

看到这么多数字,并且有一定规律,我们自然而然会联想到数组。利用其数学定义解决,关键在于第三个斐波那契数值等于前两个数值相加,而后一直如此,实现如下

/*
 * @Author: coder-jason
 * @Date: 2022-04-05 12:26:31
 * @LastEditTime: 2022-04-05 14:05:48
 */
#include <iostream>
using namespace std;
int main()
{
    int f[1000], sum = 0;
    f[0] = 2; // 由循环中等式导出的结果
    f[1] = 1;
    f[2] = 2; //初始化数组前三个元素,其他默认为 0
    while (f[f[0]] < 4000000)
    {                                        //数组第一个元素的值小于 4000000
        f[f[0] + 1] = f[f[0]] + f[f[0] - 1]; // 首先理解 F[3]=F[2]+F[1] 然后类比到数组,用元素 f[0] 代换即可
        f[0]++;                              //每计算得出一个斐波那契数,数组第一个元素加 1(记录共有多少个斐波那契数)
    }
    for (int i = 0; i < f[0]; i++)
    {
        if (f[i] % 2 == 0)
        {
            sum += f[i];
        }
    }
    cout << sum << endl;
    return 0;
}

优化

仔细思考下,常规解决方案中,我们开辟了很大的内存空间,但实质上每次增加(记录下一个斐波那契数)的却只是用到了三个元素来进行求和运算,所以我们仅开辟一个三个元素的数组就好,节省了很大的内存开销

/*
 * @Author: coder-jason
 * @Date: 2022-04-05 12:26:31
 * @LastEditTime: 2022-04-05 14:20:43
 */
#include <iostream>
using namespace std;
int main()
{
    int f[3], sum = 0;
    f[0] = 1;
    f[1] = 2;
    for (int i = 2; f[2] < 4000000; i++)
    {
        f[2] = f[1] + f[0];
        f[0] = f[1];
        f[1] = f[2]; // 后续数字依次向前推进,在前三个元素中进行计算
        if (f[2] % 2 == 0)
        {
            sum += f[2];
        }
    }
    //由于 sum 计算的是偶数项的和,但是前三个数字 1 ,2 ,3 中
    // 2 是斐波那契数,但是 3%2 不为 0 ,sum 此时并未计算斐波那契数 2,结果需要加上
    cout << sum + 2 << endl;
    return 0;
}

答案:4613732



相关文章
|
缓存 网络协议 Linux
手把手实现tcp/ip用户态协议栈,帮你实践网络知识(网络必备,面试项目)
手把手实现tcp/ip用户态协议栈,帮你实践网络知识(网络必备,面试项目)
|
数据可视化 计算机视觉
使用MMDetection进行目标检测
本文介绍了如何使用MMDetection进行目标检测。首先需按官方文档安装MMDetection,不熟悉的同学可参考提供的教程链接。安装完成后,只需准备模型配置文件、模型文件及待检测的图片或视频。示例代码展示了如何加载模型并进行图像检测,最后通过可视化展示检测结果,包括类别和置信度。
375 1
使用MMDetection进行目标检测
|
安全 网络协议 Shell
Telnet:简介、工作原理及其优缺点
【8月更文挑战第19天】
2321 0
|
8月前
|
Kubernetes Shell Windows
【Azure K8S | AKS】在AKS的节点中抓取目标POD的网络包方法分享
在AKS中遇到复杂网络问题时,可通过以下步骤进入特定POD抓取网络包进行分析:1. 使用`kubectl get pods`确认Pod所在Node;2. 通过`kubectl node-shell`登录Node;3. 使用`crictl ps`找到Pod的Container ID;4. 获取PID并使用`nsenter`进入Pod的网络空间;5. 在`/var/tmp`目录下使用`tcpdump`抓包。完成后按Ctrl+C停止抓包。
294 12
|
Java 数据库连接 数据库
Mybatis JDBC No enum constant org.apache.ibatis.type.JdbcType.TEXT异常处理
Mybatis JDBC No enum constant org.apache.ibatis.type.JdbcType.TEXT异常处理
736 0
|
JavaScript
【第12期】Vue3+TypeScript+Vite中动态引入图片等静态资源
【第12期】Vue3+TypeScript+Vite中动态引入图片等静态资源 c
2002 0
|
SQL 算法 安全
『软件工程5』详解软件项目管理之软件的度量
该文章深入讲解了软件项目管理中软件度量的重要性,包括如何进行有效的度量、度量的目的以及如何利用度量结果来改进软件质量和开发过程。
『软件工程5』详解软件项目管理之软件的度量
|
Rust 搜索推荐 测试技术
揭秘Rust性能极限!从菜鸟到高手的蜕变之路:深入剖析性能分析与调优的隐秘技巧
【8月更文挑战第31天】Rust凭借卓越的性能、内存安全性和并发支持,成为高性能系统开发的首选语言。本文详细介绍Rust的性能优化流程,涵盖从基础分析到高级调优的技巧,并通过示例代码展示具体操作。内容包括理解Rust的性能优势、常用性能分析工具(如Cargo Bench、Valgrind和perf)、基准测试示例以及优化技巧,如减少内存分配、利用并发模型、优化数据结构和避免过度抽象。通过持续优化与迭代,开发者可充分发挥Rust的潜力,提升程序性能。
932 0
|
C++
VS #define _CRT_SECURE_NO_WARNINGS 1 添加了仍然报错
一些小的错误,往往让初学者抓耳挠腮 VS #define _CRT_SECURE_NO_WARNINGS 1 一定要放在最开始的位置
709 2
|
缓存 网络协议 安全
【常见开源库的二次开发】HTTP之libcurl库——基础知识扫盲(一)
【常见开源库的二次开发】HTTP之libcurl库——基础知识扫盲(一)
639 1