【欧拉计划】偶数斐波那契数

news2024/11/15 18:51:45

题目链接:偶数斐波那契数

解法一:暴力枚举

看见题目,第一反应就是先找到小于400万的所有斐波那契数,再从这些斐波那契数中筛选出偶数进行求和。
由于递归方法求斐波那契数的时间复杂度较高,故这里采用迭代的方法。

先通过循环逐个计算每个斐波那契数,直到达到了指定的最大值 。在循环中,每次更新 n 的值,并根据斐波那契数列的递推公式fib[n] = fib[n-1] + fib[n-2]来更新fib[n] 的值。然后,通过一个循环遍历斐波那契数列的所有元素,并累加所有偶数元素的和到变量sum中。

C语言代码

#include<stdio.h>
#define Max_N 4000000
int fib[Max_N+5] = {0};
int main (){
    fib[1]=1,fib[2]=2;
    int n = 2;
    while(fib[n]+fib[n-1]<=Max_N){
        n++;
        fib[n]=fib[n-1]+fib[n-2];
    }
    int sum = 0;
    for(int i = 1;i<=n;i++){
        if(fib[i]%2==0)
            sum+=fib[i];
    }
    printf("%d\n",sum);
    return 0;
}

Java代码

public class Fib_Sum {  

    public static void main(String[] args) {  
        final int MAX_N = 4000000;  
        int[] fib = new int[MAX_N + 5];  
        fib[1] = 1;  
        fib[2] = 2;  
        int n = 2;  
        while (fib[n] + fib[n - 1] <= MAX_N) {  
            n++;  
            fib[n] = fib[n - 1] + fib[n - 2];  
        }  
        int sum = 0;  
        for (int i = 1; i <= n; i++) {  
            if (fib[i] % 2 == 0) {  
                sum += fib[i];  
            }  
        }  
        System.out.println(sum);  
    }  
}

解法二:滚动数组

简单的理解就是让数组滚动起来,每次都使用固定的几个存储空间,来达到压缩,节省存储空间的作用。这道题,我们要用到的是连续的解,前面的解是可以舍去。所以可以让数组滚起来,这样可以减少空间的消耗。

C语言代码

#include<stdio.h>
#define Max_N  4000000
int main (){
    int fib[3]={0};
    fib[1]=1,fib[2]=2;
    int n = 2,sum = 2; //因为第二项斐波那契数也是偶数
    while(fib[n % 3] + fib[(n - 1) % 3] <= Max_N){
        n++;
        fib[n % 3] = fib[(n - 1) % 3] + fib[( n - 2) % 3];
        if(fib[n % 3] % 2 == 0) 
            sum += fib[n % 3];
    }
    printf("%d\n",sum);
    return 0;
}

按照这个思路,我们设置不需要开辟数组,直接利用三个变量来存储数据。

#include<stdio.h>
#define Max_N 4000000
int main (){
	int a = 1, b = 2, c , sum = 2;
    while(a + b <= Max_N){
        c = a + b;
        a = b;
        b = c;
        if(c % 2 ==0)
            sum+=c;
    }
    printf("%d\n",sum);
    return 0;
}

上面这两段代码,在性能上没有显著的差异,它们的时间复杂度和空间复杂度都是 O(1)。但是,第二段代码可能更容易理解。因为它直接操作了斐波那契数列的当前值和前两个值,而无需通过数组索引。

Java代码

public class FibonacciSum {
    public static void main(String[] args) {
        final int Max_N = 4000000;
        int[] fib = new int[3];
        fib[1] = 1;
        fib[2] = 2;
        int n = 2;
        int sum = 2; // 因为第二项斐波那契数也是偶数

        while (fib[n % 3] + fib[(n - 1) % 3] <= Max_N) {
            n++;
            fib[n % 3] = fib[(n - 1) % 3] + fib[(n - 2) % 3];
            if (fib[n % 3] % 2 == 0) {
                sum += fib[n % 3];
            }
        }

        System.out.println(sum);
    }
}

public class FibonacciSum {
    public static void main(String[] args) {
        final int Max_N = 4000000;
        int a = 1, b = 2, c, sum = 2;
        
        while (a + b <= Max_N) {
            c = a + b;
            a = b;
            b = c;
            if (c % 2 == 0) {
                sum += c;
            }
        }
        
        System.out.println(sum);
    }
}

参考文章

求解斐波那契数列(Fibonacci Numbers)算法居然有9种,你知道几种?
神奇的斐波那契数列

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/901340.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++笔记之全局函数做友元与类做友元

C笔记之全局函数做友元与类做友元 code review! 文章目录 C笔记之全局函数做友元与类做友元1.全局函数做友元2.类作友元 1.全局函数做友元 代码 #include <iostream> using namespace std;class MyClass { private:int x; public:MyClass(int a) : x(a) {}friend void…

互斥锁概念使用

互斥锁的创建两种方式 1.动态方式 #include <pthread.h> #include <stdio.h> #include <unistd.h> #include <string.h> FILE *fp; void *func2(void *arg) {pthread_detach(pthread_self());printf("this is func2 thread\n");char str2[]…

mybatis入门的环境搭建及快速完成CRUD(增删改查)

又是爱代码的一天 一、MyBatis的介绍 ( 1 ) 背景 MyBatis 的背景可以追溯到 2002 年&#xff0c;当时 Clinton Begin 开发了一个名为 iBATIS 的持久化框架。iBATIS 的目标是简化 JDBC 编程&#xff0c;提供一种更直观、易用的方式来处理数据库操作。 在传统的 JDBC 编程中&…

【大数据】Flink 详解(五):核心篇 Ⅳ

Flink 详解&#xff08;五&#xff09;&#xff1a;核心篇 Ⅳ 45、Flink 广播机制了解吗&#xff1f; 从图中可以理解 广播 就是一个公共的共享变量&#xff0c;广播变量存于 TaskManager 的内存中&#xff0c;所以广播变量不应该太大&#xff0c;将一个数据集广播后&#xff0…

代码随想录算法训练营day39 | 62. 不同路径,63. 不同路径 II

目录 62. 不同路径 63. 不同路径 II 62. 不同路径 类型&#xff1a;动态规划 难度&#xff1a;medium 思路&#xff1a; 应用二维数组的动态规划&#xff0c;到达某个方格的方法数目&#xff0c;为这个方格的上一个方格和左一个方格的方法数目和。 需要先初始化第一行和第一…

ubuntu安装Microsoft Edge并设置为中文

1、下载 edge.deb 版本并安装 sudo dpkg -i microsoft-edg.deb 2. 设置默认中文显示 如果是通过.deb方式安装的&#xff1a; 打开默认安装路径下的microsoft-edge-dev文件&#xff0c;在文件最开头加上: export LANGUAGEZH-CN.UTF-8 &#xff0c;保存退出。 cd /opt/micr…

【Redis】什么是缓存击穿,如何预防缓存击穿?

【Redis】什么是缓存击穿&#xff0c;如何预防缓存击穿&#xff1f; 缓存击穿是指一个 Key 非常热点&#xff0c;大并发集中对这一个点进行访问&#xff0c;当这个Key 在失效的瞬间&#xff0c;持续的大并发就会穿破缓存&#xff0c;直接请求数据库。缓存击穿和缓存雪崩的区别…

代码随想录-字符串01 344.反转字符串541. 反转字符串II替换空格翻转字符串里的单词左旋转字符串

题目目录 ● 344.反转字符串 ● 541. 反转字符串II ● 剑指Offer 05.替换空格 ● 151.翻转字符串里的单词 ● 剑指Offer58-II.左旋转字符串 344.反转字符串 344.反转字符串 很经典的字符串考察点&#xff0c;考察对双指针的熟悉程度。 解法是通过双指针从字符串数组两边向中…

JavaScript函数式编程【进阶】

作者&#xff1a;20岁爱吃必胜客&#xff08;坤制作人&#xff09;&#xff0c;近十年开发经验, 跨域学习者&#xff0c;目前于海外某世界知名高校就读计算机相关专业。荣誉&#xff1a;阿里云博客专家认证、腾讯开发者社区优质创作者&#xff0c;在CTF省赛校赛多次取得好成绩。…

Linux 安全技术和防火墙

目录 1 安全技术 2 防火墙 2.1 防火墙的分类 2.1.1 包过滤防火墙 2.1.2 应用层防火墙 3 Linux 防火墙的基本认识 3.1 iptables & netfilter 3.2 四表五链 4 iptables 4.2 数据包的常见控制类型 4.3 实际操作 4.3.1 加新的防火墙规则 4.3.2 查看规则表 4.3.…

7-7 验证“哥德巴赫猜想”

分数 20 全屏浏览题目 切换布局 作者 徐镜春 单位 浙江大学 数学领域著名的“哥德巴赫猜想”的大致意思是&#xff1a;任何一个大于2的偶数总能表示为两个素数之和。比如&#xff1a;24519&#xff0c;其中5和19都是素数。本实验的任务是设计一个程序&#xff0c;验证20亿以…

认识负载均衡||WEBSHELL

目录 一、负载均衡 1.nginx负载均衡算法 2.nginx反向代理-负载均衡 二、webshell 1.构造不含数字和字母的webshell 2.如何绕过 一、负载均衡 1.nginx负载均衡算法 &#xff08;1&#xff09;轮询&#xff08;默认&#xff09;每个请求按时间顺序逐一分配到不同的后端服务&…

听GPT 讲Prometheus源代码--rules

Prometheus的rules目录主要包含规则引擎和管理规则的文件: engine.go 该文件定义了规则引擎的接口和主要结构,包括Rule,Record,RuleGroup等。它提供了规则的加载、匹配、评估和结果记录的功能。 api.go 定义了用于管理和查询规则的RESTful API,包括获取、添加、删除规则等方法。…

类之间的比较

作者简介&#xff1a; zoro-1&#xff0c;目前大一&#xff0c;正在学习Java&#xff0c;数据结构等 作者主页&#xff1a; zoro-1的主页 欢迎大家点赞 &#x1f44d; 收藏 ⭐ 加关注哦&#xff01;&#x1f496;&#x1f496; 类之间的比较 固定需求式比较器 固定需求式 通过…

恶意软件分析与反制: 深入研究各类恶意软件,介绍分析技术以及如何构建有效的反恶意软件策略

第一章&#xff1a;引言 在数字化时代&#xff0c;恶意软件已经成为网络安全领域的一大威胁。从病毒、蠕虫到特洛伊木马&#xff0c;各类恶意软件不断进化&#xff0c;威胁着个人、组织 ja以国家的信息安全。本文将深入探讨恶意软件的分析与反制方法&#xff0c;帮助读者更好地…

SpringCloud新人入门手册

一、SpringBoot流程图 二、创建一个单pom项目改为父子pom项目 0、检查idea是否在父模块pom中生成子模块 <modules><module>eureka</module></modules> 1、子模块pom.xml添加 <dependencies><dependency><groupId>org.springframew…

Redis专题-秒杀

Redis专题-并发/秒杀 开局一张图&#xff0c;内容全靠“编”。 昨天晚上在群友里看到有人在讨论库存并发的问题&#xff0c;看到这里我就决定写一篇关于redis秒杀的文章。 1、理论部分 我们看看一般我们库存是怎么出问题的 其实redis提供了两种解决方案&#xff1a;加锁和原子操…

TiDB 多集群告警监控-中章-融合多集群 Grafana

作者&#xff1a; longzhuquan 原文来源&#xff1a; https://tidb.net/blog/ac730b0f 背景 随着公司XC改造步伐的前进&#xff0c;越来越多的业务选择 TiDB&#xff0c;由于各个业务之间需要物理隔离&#xff0c;避免不了的 TiDB 集群数量越来越多。虽然每套 TiDB 集群均有…

把握潮流:服装定制小程序的发展与趋势

随着互联网的快速发展&#xff0c;小程序成为了人们生活中不可或缺的一部分。尤其在服装行业&#xff0c;定制化已经成为了一种趋势。为了满足消费者个性化的需求&#xff0c;服装定制小程序应运而生。 为了方便开发者的设计和制作&#xff0c;我们可以使用第三方的制作平台来创…

Dubbo使用

<!--dubbo--><dependency><groupId>com.alibaba.spring.boot</groupId><artifactId>dubbo-spring-boot-starter</artifactId><version>2.0.0</version></dependency>接口 public interface IUseService {public String…