鱼C论坛

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

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

  [复制链接]
发表于 2021-10-16 14:51:03 | 显示全部楼层
#求斐波那契数列四百万内项数和
a = [1,1]
sum = 0
for i in range(2,10000):
    a.append(a[i-2]+a[i-1])
    if a[i]<4000000:
        if a[i]%2 == 0:
            sum=sum+a[i]
    else:
        break
print(sum)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-10-25 16:32:22 | 显示全部楼层
  1. #include<stdio.h>

  2. #define MAX 4000000L

  3. int main(void)
  4. {
  5.         int result = 0,temp = 0;
  6.         int i1 = 1,i2 = 2;
  7.        
  8.         while(i2 < MAX)
  9.         {
  10.             if(i2 % 2 == 0)
  11.                           result += i2;
  12.                  temp = i1 + i2;
  13.                  i1 = i2;
  14.                  i2 = temp;
  15.         }
  16.         printf("%d",result);
  17.        
  18.         return 0;
  19. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> 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 | 显示全部楼层
  1. pub fn run() -> Result<(), Box<dyn std::error::Error>> {
  2.     let (mut a, mut b) = (1u32, 2u32);
  3.     let mut sum = 0u32;
  4.     while b < 4000000 {
  5.         if b % 2 == 0 {
  6.             sum += b;
  7.         }
  8.         (a, b) = (b, a + b)
  9.     }
  10.     println!("{sum}");
  11.     Ok(())
  12. }
复制代码

[Project Euler 2]
4613732
[Task finished in 0.0002328s]
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

使用道具 举报

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

  3. int main(){
  4.         int a = 0, b = 1, a2 = 0, sum;
  5.        
  6.         while (b < 4000000){
  7.                 if (b % 2 == 0){
  8.                         sum += b;
  9.                 }
  10.                 a2 = a;
  11.                 a = b;
  12.                 b = b + a2;
  13.         }
  14.         cout << sum << endl;

  15.         return 0;
  16. }
复制代码

python:
  1. a = 0
  2. b = 1
  3. sum_ = 0
  4. while b < 4000000:
  5.     if b % 2 == 0:
  6.         sum_ += b
  7.     a, b = b, b + a
  8. print(sum_)
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2022-12-19 19:15:32 | 显示全部楼层
python
  1. #暴力循环,O(n)
  2. NUM=4000000
  3. f1=0
  4. f2=1
  5. num=0
  6. while f2<NUM:
  7.     f2,f1=f2+f1,f2
  8.     if f2%2==0 and f2<NUM:
  9.         num=num+f2
  10. print(num)
复制代码

优化后O(1),其实数据太少都不值得优化
  1. from math import sqrt
  2. from math import log
  3. # #函数表达,数列通项式,和的数列的通项式
  4. # for i in range(10):
  5. #     print(sqrt(5)/5*(((1+sqrt(5))/2)**i)-sqrt(5)/5*(((1-sqrt(5))/2)**i))
  6. def f(i):
  7.     return sqrt(5)/5*(((1+sqrt(5))/2)**i)-sqrt(5)/5*(((1-sqrt(5))/2)**i)
  8. #获取N,预估加精确
  9. N=int(log(NUM)/log((1+sqrt(5))/2))+1
  10. if f(N)>NUM:
  11.     while f(N)>NUM:
  12.         N=N-1
  13.     N=N-1
  14. else:
  15.     while f(N)<=NUM:
  16.         N=N+1
  17.     N=N-2
  18. # N大起来就不行了,double位数不够
  19. a=1/4*(3/sqrt(5)+1)
  20. b=1/4*(3/sqrt(5)-1)
  21. k1=2+sqrt(5)
  22. k2=2-sqrt(5)
  23. n=(N+1)//3
  24. num2=a*(k1**n)-b*(k2**n)-1/2
  25. print(int(num2))
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-27 19:16

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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