鱼C论坛

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

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

  [复制链接]
发表于 2020-8-21 15:09:43 | 显示全部楼层
l = [1,2]
i = 1
sum = 2
while i <= 4000000:
    i += 1
    x = l[i-2]+l[i-1]
    if x > 4000000:
        break
    l.append(x)
    if x % 2 == 0 :
        sum += x
print(l)
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 | 显示全部楼层
from time import time

def sum1(x):
    a,b = 1,2
    c = 2
    
    while b<x+1:
        a,b = b,a+b
        if b % 2 == 0:
            c = c + b
    print("所求偶数项之和为 %s" % c)
    
t1 = time()
sum1(4000000)
t2 = time()
t = t2 -t1    
print(f"运行时间为: {t} 秒")

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

使用道具 举报

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

while f3 < 4000000:
    f3 = f1 + f2
    if f3 % 2 == 0:
        sum += f3
    
    f1 = f2
    f2 = f3
    
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 | 显示全部楼层
#include <stdio.h>

#define MAX 100

int main ()
{
        int f[MAX] = {1, 2};
        int i, sum = 2;
        
        printf("%d %d", f[0], f[1]);
        for (i = 2; i < MAX; i++)
        {
                f[i] = f[i - 1] + f[i - 2];
                if (f[i] > 4000000)
                {
                        break;
                }
                printf("%d ", f[i]);
                if (f[i] % 2 == 0)
                {
                        sum += f[i];
                }
        }
        printf("\n");
        
        printf("sum = %d\n", sum);
        
        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> 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

                               
登录/注册后可看大图
    public static void main(String[] args) {
        Solution s = new Solution();
        System.out.println(s.fib(s.shu())
                +"最接近4000000的那个斐波第:"+ s.shu()+"个数。。。");
    }
    static class Solution {
        public int shu(){
            while (true){
                //递推关系
                int prev = 0,curr = 1,count=0;
                for (int i = 2;;i++){
                    int sum = prev + curr;
                    prev = curr;
                    curr = sum;
                    count++;
                    if (sum >4000000){
                        break;
                    }
                }
                return count;
            }
        }
        //最优化解法
        public double fib(int n) {
            double count = 0;
            //base case
            if (n==0 || n==1) return n;

            //递推关系
            int prev = 0,curr = 1;
            for (int i = 2;i<= n;i++){
                int sum = prev + curr;
                prev = curr;
                curr = sum;
                if (sum % 2 == 0){
                    count = count+sum;
                }
            }
            return count;
        }
    }
想知道小甲鱼最近在做啥?请访问 -> 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 | 显示全部楼层
def fbnq():
    added1=1
    added2=1
    result2=0
    for num in range(3,100):
        result1=added1+added2
        added1=result1
        added2=result1-added2
        if result1%2==0:
            result2+=result1
        if result1>=4000000:
            break
    return result2
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 | 显示全部楼层
q = 0
a = 1
b = 1
c = 2
while c < 4000000:
    if c % 2 == 0:
        q = q + c
    a = b
    b = c
    c = a + b
print(q)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

static int count;
static unsigned int result;

int fib1(int i)
{                
        count += 1;
        if (i<=2) return 1;
        return fib1(i-1) + fib1(i-2);
}

int fib2(int n)
{
        int a = 1, b = 1;
        int i;
        if (n <= 2) return 1;
        while(1)
        {
                if (a + b > n) break;
                count += 1;
                b = a + b;
                a = b - a; 
                if (!(b%2)) result += b;
        }
        return b;
        
}

int main(void)
{
        int i;
        
        printf("%d\n", fib2(4000000));
        printf("count = %d\n", count);
        printf("result is %u\n", result);

        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> 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
回复 支持 反对

使用道具 举报

发表于 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
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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