鱼C论坛

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

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

  [复制链接]
发表于 2020-8-8 12:51:53 | 显示全部楼层
本帖最后由 永恒的蓝色梦想 于 2020-8-8 12:57 编辑
583164028 发表于 2020-8-7 21:21
看了一圈  大部分都是循环 判定  
根据斐波那契数列通向公式计算400万的项,向下取整
观察下表偶数出现在 ...


哈哈,你可以看下 134 楼,用的是同样的原理,只不过没有开数组

svg 图像无法正常显示,所以我帮你编辑了一下,改成了 PNG 图片
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-21 15:09:43 | 显示全部楼层
  1. l = [1,2]
  2. i = 1
  3. sum = 2
  4. while i <= 4000000:
  5.     i += 1
  6.     x = l[i-2]+l[i-1]
  7.     if x > 4000000:
  8.         break
  9.     l.append(x)
  10.     if x % 2 == 0 :
  11.         sum += x
  12. print(l)
  13. print(sum)
复制代码


不会高数~~~平平无奇方案= =

点评

我很赞同!: 5.0
我很赞同!: 5
针不戳  发表于 2020-8-21 16:09

评分

参与人数 1荣誉 +3 鱼币 +3 贡献 +2 收起 理由
永恒的蓝色梦想 + 3 + 3 + 2

查看全部评分

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

使用道具 举报

发表于 2020-8-29 00:07:32 | 显示全部楼层
  1. from time import time

  2. def sum1(x):
  3.     a,b = 1,2
  4.     c = 2
  5.    
  6.     while b<x+1:
  7.         a,b = b,a+b
  8.         if b % 2 == 0:
  9.             c = c + b
  10.     print("所求偶数项之和为 %s" % c)
  11.    
  12. t1 = time()
  13. sum1(4000000)
  14. t2 = time()
  15. t = t2 -t1   
  16. print(f"运行时间为: {t} 秒")
复制代码


所求偶数项之和为 4613732
运行时间为: 0.012990713119506836 秒
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-9-12 09:57:28 | 显示全部楼层
  1. sum = 2
  2. f1 = 1
  3. f2 = 2
  4. f3 = 0

  5. while f3 < 4000000:
  6.     f3 = f1 + f2
  7.     if f3 % 2 == 0:
  8.         sum += f3
  9.    
  10.     f1 = f2
  11.     f2 = f3
  12.    
  13. print("在斐波那契数列中,找出4百万以下的项中值为偶数的项之和为:" + str(sum))
复制代码


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

使用道具 举报

发表于 2020-10-21 17:59:21 | 显示全部楼层
def func(maxNum =4000000):
    def fib(maxNum):
        a =0
        b =1
        while True:
            nextNum =a+b
            if nextNum >maxNum:
                break
            else:
                yield nextNum
            a ,b =b ,nextNum
            
    f =fib(maxNum)
    allFib =[i for i in f ]
    print(allFib)
    evenNum_fib =[i for i in allFib if i %2 ==0]
    print(evenNum_fib)
    result =sum(evenNum_fib)
    return result



print(func())
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-11-4 20:19:43 | 显示全部楼层
def fib(n):

    if n == 1:
        return 1
    if n == 2 :
        return 2
    if n > 2:
        return fib(n-1) + fib(n-2)

a = []
for i in range(1, 10):
    x = fib(i)
    if x % 2 == 0:
        a.append(x)

count = 0
for i in a:
    count = count + i
print (count)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-11-26 10:23:37 | 显示全部楼层
每天进步一点点
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-12-26 09:40:50 | 显示全部楼层
  1. #include <stdio.h>

  2. #define MAX 100

  3. int main ()
  4. {
  5.         int f[MAX] = {1, 2};
  6.         int i, sum = 2;
  7.        
  8.         printf("%d %d", f[0], f[1]);
  9.         for (i = 2; i < MAX; i++)
  10.         {
  11.                 f[i] = f[i - 1] + f[i - 2];
  12.                 if (f[i] > 4000000)
  13.                 {
  14.                         break;
  15.                 }
  16.                 printf("%d ", f[i]);
  17.                 if (f[i] % 2 == 0)
  18.                 {
  19.                         sum += f[i];
  20.                 }
  21.         }
  22.         printf("\n");
  23.        
  24.         printf("sum = %d\n", sum);
  25.        
  26.         return 0;
  27. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-3-8 21:31:11 | 显示全部楼层
#include <stdio.h>

int fib( int i )
{
        if( 1 == i )
        {
                return 1;
        }
        else if( 2 == i )
        {
                return 2;
        }
        else
        {
                return fib(i-1) + fib(i-2);
        }

}

int main()
{
        int sum = 0;
        int i = 1;
        while( fib(i) <= 4000000 )
        {
                if( fib(i)%2 == 0 )
                {
                        sum += fib(i);
                }
                i++;
        }
        printf("%d\n",sum);
        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-3-28 00:34:06 | 显示全部楼层
本帖最后由 hjg 于 2021-3-28 00:35 编辑

斐波那契 有3种解法  自顶向下   带记录的自顶向下  迭代式的从下往上   
这边我直接写最优的解法  java

                               
登录/注册后可看大图

  1.     public static void main(String[] args) {
  2.         Solution s = new Solution();
  3.         System.out.println(s.fib(s.shu())
  4.                 +"最接近4000000的那个斐波第:"+ s.shu()+"个数。。。");
  5.     }
  6.     static class Solution {
  7.         public int shu(){
  8.             while (true){
  9.                 //递推关系
  10.                 int prev = 0,curr = 1,count=0;
  11.                 for (int i = 2;;i++){
  12.                     int sum = prev + curr;
  13.                     prev = curr;
  14.                     curr = sum;
  15.                     count++;
  16.                     if (sum >4000000){
  17.                         break;
  18.                     }
  19.                 }
  20.                 return count;
  21.             }
  22.         }
  23.         //最优化解法
  24.         public double fib(int n) {
  25.             double count = 0;
  26.             //base case
  27.             if (n==0 || n==1) return n;

  28.             //递推关系
  29.             int prev = 0,curr = 1;
  30.             for (int i = 2;i<= n;i++){
  31.                 int sum = prev + curr;
  32.                 prev = curr;
  33.                 curr = sum;
  34.                 if (sum % 2 == 0){
  35.                     count = count+sum;
  36.                 }
  37.             }
  38.             return count;
  39.         }
  40.     }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-3-28 00:36:16 | 显示全部楼层
hjg 发表于 2021-3-28 00:34
斐波那契 有3种解法  自顶向下   带记录的自顶向下  迭代式的从下往上   
这边我直接写最优的解法  java
...

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

使用道具 举报

发表于 2021-3-31 19:55:57 | 显示全部楼层
int main(int argc, char *argv[]) {
        int a=1;
        int b=2;
        int sum=0;
        int result=0;
        while(b<4000000){
                if(a%2==0){
                        result=result+a;
                }
                if(b%2==0){
                        result=result+b;
                }
                if(sum%2==0){
                        result=result+sum;
                }
                sum=a+b;
                a=b+sum;
                b=a+sum;
        }
        printf("The result is:%d",result);
        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-4-20 05:43:53 | 显示全部楼层
需求:斐波那契数列中数值不超过 4 百万的项,找出这些项中值为偶数的项之和。
拆解:斐波那契数列,不超过 4 百万的项,值偶数的项。
检查:偶数的项求和(由于400万项,我的电脑顶不住,这里给出10项)(便于验证)
代码:
i,a,b = 0,1,2
list1 =[]
while i < 10:
    list1.append(a)
    c = a + b
    a,b = b,c
    i +=1
print(list1)
z = sum(x for x in list1 if not x % 2)
print(z)
最后
list1 = [1, 2, 3, 5, 8, 13, 21, 34, 55, 89]
z = 44

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

使用道具 举报

发表于 2021-5-2 20:50:10 | 显示全部楼层
  1. def fbnq():
  2.     added1=1
  3.     added2=1
  4.     result2=0
  5.     for num in range(3,100):
  6.         result1=added1+added2
  7.         added1=result1
  8.         added2=result1-added2
  9.         if result1%2==0:
  10.             result2+=result1
  11.         if result1>=4000000:
  12.             break
  13.     return result2
  14. print(fbnq())
复制代码

P.S斐波那契数列第100项已经远大于4000000了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-5-14 17:40:01 | 显示全部楼层
import time
T1 = time.perf_counter()

a = 1
b = 2
c = 0
summary = []
for i in range(31):
    if b < 4000000 :
        summary.append(b)
        a,b = b,a+b
    else:
        continue
for each in summary:
    if each % 2 == 0:
        c += each
    else:
        continue
print(c)
print(summary)

T2 =time.perf_counter()
print('程序运行时间:%s毫秒' % ((T2 - T1)*1000))
4613732  34.97040000000007毫秒
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-7-9 15:07:01 | 显示全部楼层
  1. q = 0
  2. a = 1
  3. b = 1
  4. c = 2
  5. while c < 4000000:
  6.     if c % 2 == 0:
  7.         q = q + c
  8.     a = b
  9.     b = c
  10.     c = a + b
  11. print(q)
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-8-6 23:30:01 | 显示全部楼层
  1. #include <stdio.h>

  2. static int count;
  3. static unsigned int result;

  4. int fib1(int i)
  5. {               
  6.         count += 1;
  7.         if (i<=2) return 1;
  8.         return fib1(i-1) + fib1(i-2);
  9. }

  10. int fib2(int n)
  11. {
  12.         int a = 1, b = 1;
  13.         int i;
  14.         if (n <= 2) return 1;
  15.         while(1)
  16.         {
  17.                 if (a + b > n) break;
  18.                 count += 1;
  19.                 b = a + b;
  20.                 a = b - a;
  21.                 if (!(b%2)) result += b;
  22.         }
  23.         return b;
  24.        
  25. }

  26. int main(void)
  27. {
  28.         int i;
  29.        
  30.         printf("%d\n", fib2(4000000));
  31.         printf("count = %d\n", count);
  32.         printf("result is %u\n", result);

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

使用道具 举报

发表于 2021-10-1 14:29:37 | 显示全部楼层
#include <iostream>
using namespace std;
int main()
{
        int a=1,b=2,c=2,i=3;
        while(i<4000001)
        {
                c=a+b;
                a=b;
                b=c;
                i++;
        }
        cout<<c;
        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-10-7 19:41:03 | 显示全部楼层
fibonacci = []
for i in range(1,4000000):
    if i <= 2:
        fibonacci.append(i)
    else:
        fibonacci.append(fibonacci[i-2] + fibonacci[i-3])
            
f = fibonacci

sum = 0
for i in f:
    if i % 2 == 0:
        sum += i

print(sum)







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

使用道具 举报

发表于 2021-10-8 15:39:04 | 显示全部楼层
#斐波那契数列中值不超过4百万的项中值为偶数的项的和

#迭代dibonacci数列
def fibonacci(n):
    n1 = 1
    n2 = 1
    n3 = 1

    if n < 1 :
        print('输入有误!')
        return -1
    while (n-2) > 0:
        n3 = n2 + n1
        n1 = n2
        n2 = n3
        n -= 1

    return n3

#计算值为偶数的项之和
i = 2
result = 0
while i:
    if fibonacci(i) > 4000000:
        break
    elif fibonacci(i) % 2 == 0:
        result += fibonacci(i)
        i += 1
    else:
        i += 1

print(result)

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-19 19:23

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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