鱼C论坛

 找回密码
 立即注册
楼主: 欧拉计划

题目2:在斐波那契数列中,找出4百万以下的项中值为偶数的项之和

  [复制链接]
发表于 2021-10-25 16:32:22 | 显示全部楼层
#include<stdio.h>

#define MAX 4000000L

int main(void)
{
        int result = 0,temp = 0;
        int i1 = 1,i2 = 2;
        
        while(i2 < MAX)
        {
            if(i2 % 2 == 0)
                          result += i2;
                 temp = i1 + i2;
                 i1 = i2;
                 i2 = temp;
        }
        printf("%d",result);
        
        return 0;
} 
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-11-12 00:38:42 | 显示全部楼层
结果:sum = 9024243749793644159
#include<stdio.h>

int main(void)
{
        unsigned long long int a1 = 1, a2 = 2;
        unsigned int i;
        unsigned long long int sum = a2;
        unsigned long long int a;
       
        for (i = 3; i < 300000; i++)
        {
                a = a1 + a2;
                if (i % 2 == 0)
                {
                        sum = sum + a;
                }
                else
                {
                        ;
                }
                a1 = a2;
                a2 = a;
        }
        printf("sum = %llu\n", sum);
        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-4-17 09:53:25 | 显示全部楼层
本人使用Java写的 运行结果为4613762
int a=0,b=1,c=0,sum=0;
        for(;c<=4000000;){
            c=a+b;
            a=b;
            b=c;
            if(c%2==0){
                sum+=c;
            }
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-5-20 21:34:00 | 显示全部楼层
limit = 4000000


def even_sum():
    fibonacci_list = [1, 2]
    f0 = 1
    f1 = 2
    while True:
        f1 = f0 + f1
        f0 = f1 - f0
        fibonacci_list.append(f1)
        if f1 > limit:
            break
    even_list = [x for x in fibonacci_list if x % 2 == 0]
    result = sum(even_list)
    print(result)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-7-24 19:21:05 | 显示全部楼层
#include <stdio.h>
#include <stdlib.h>

#define MAX 4000000

long fibs(int n) //求斐波那契数列
{
    if(n==0)
        return 0;
    else if (n==1 || n==2)
        return 1;
        else
        return fibs(n-1)+fibs(n-2);
}

int main()
{
    int i;
    long iFib,iSum;
    iFib=0;
    iSum=0;
    for(i=1;iFib<MAX;i++){
        iFib=fibs(i);
        if(iFib%2==0)
            iSum+=iFib;
    }

    printf("斐波那契数列小于4000000的偶数项之和为:%ld\n",iSum);
    system("pause");

    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-8-9 12:28:35 | 显示全部楼层
pub fn run() -> Result<(), Box<dyn std::error::Error>> {
    let (mut a, mut b) = (1u32, 2u32);
    let mut sum = 0u32;
    while b < 4000000 {
        if b % 2 == 0 {
            sum += b;
        }
        (a, b) = (b, a + b)
    }
    println!("{sum}");
    Ok(())
}
[Project Euler 2]
4613732
[Task finished in 0.0002328s]
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-11-8 19:56:16 | 显示全部楼层
int fibonacci_even(int n) {//在斐波那契数列中,找出n以下的项中值为偶数的项之和
        int a = 1, b = 2, now = 0,sum=2;
        while ((a + b) < n) {
                now = a + b;
                if (now % 2 == 0) { sum = sum + now; }
                a = b;
                b = now;
        }
        return sum;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-11-27 08:25:26 | 显示全部楼层
C++:
#include <iostream>
using namespace std;

int main(){
        int a = 0, b = 1, a2 = 0, sum;
        
        while (b < 4000000){
                if (b % 2 == 0){
                        sum += b;
                }
                a2 = a;
                a = b;
                b = b + a2;
        }
        cout << sum << endl;

        return 0;
}
python:
a = 0
b = 1
sum_ = 0
while b < 4000000:
    if b % 2 == 0:
        sum_ += b
    a, b = b, b + a
print(sum_)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2022-12-19 19:15:32 | 显示全部楼层
python
#暴力循环,O(n)
NUM=4000000
f1=0
f2=1
num=0
while f2<NUM:
    f2,f1=f2+f1,f2
    if f2%2==0 and f2<NUM:
        num=num+f2
print(num)
优化后O(1),其实数据太少都不值得优化
from math import sqrt
from math import log
# #函数表达,数列通项式,和的数列的通项式
# for i in range(10):
#     print(sqrt(5)/5*(((1+sqrt(5))/2)**i)-sqrt(5)/5*(((1-sqrt(5))/2)**i))
def f(i):
    return sqrt(5)/5*(((1+sqrt(5))/2)**i)-sqrt(5)/5*(((1-sqrt(5))/2)**i)
#获取N,预估加精确
N=int(log(NUM)/log((1+sqrt(5))/2))+1
if f(N)>NUM:
    while f(N)>NUM:
        N=N-1
    N=N-1
else:
    while f(N)<=NUM:
        N=N+1
    N=N-2
# N大起来就不行了,double位数不够
a=1/4*(3/sqrt(5)+1)
b=1/4*(3/sqrt(5)-1)
k1=2+sqrt(5)
k2=2-sqrt(5)
n=(N+1)//3
num2=a*(k1**n)-b*(k2**n)-1/2
print(int(num2))
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-6-4 00:24:35 | 显示全部楼层
#include<iostream>
using namespace std;

int main(){
        int sum=2,a=1,b=2;
        //通过观察序列规律,第3,6,9,...项必为偶数,所以直接求出并累加即可 
        while(1){
                for(int i=0;i<3;i++){
                        b+=a;
                        a=b-a;        
                }
                if(b<4000000) sum+=b; else break;
        }
        cout << sum << endl;
        return 0;
}

输出:
4613732

--------------------------------
Process exited after 0.01115 seconds with return value 0
请按任意键继续. . .

欢迎指正
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-6-4 00:30:41 | 显示全部楼层
幻世伽蓝 发表于 2016-7-3 17:13
两个代码结果不一样,求大神指出问题

第二个代码fou循环的设置错了
for(a=1,b=1;c<4000000;c=a+b){
  if(c%2==0) sum+=c;
  a=b;
  b=c;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-9-11 18:38:56 | 显示全部楼层
C++练习打卡 day2
#include <iostream>
using namespace std;

int main() {
    int sum = 0;
    int a = 1;
    int b = 2;
    while (a <= 4000000) {
        if (a % 2 == 0) sum += a;
        int temp = a + b;
        a = b;
        b = temp;
    }
    cout << sum << endl;
    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-22 15:50

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表