鱼C论坛

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

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

  [复制链接]
发表于 2016-8-12 01:50:05 | 显示全部楼层

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

  1. def x(n):
  2.     s = 0
  3.     a = 0
  4.     b = 1
  5.     while b < n:
  6.         if b % 2 == 0:
  7.             s += b
  8.         a, b = b, a + b
  9.     return s
  10. print(x(4000000))
复制代码
终于会发代码了。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-8-12 17:40:10 | 显示全部楼层
用的VC++6.0,不支持C99,所以最大也只能用unsigned long类型。所以最大数值只能是2^32-1。试了一下,速度还是很快的。

#include <stdio.h>
#include <math.h>
void main()
{
        unsigned long s=4294967295,t=1,i;
        for(i=2;i<s;i++)
        {
        if(s%i==0)
        {
        s=s/i;
        t=t*i;
        i=2;
        }
        if(i>sqrt(s)) break;
        }
        printf("%u\n",t);
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-8-18 09:31:46 | 显示全部楼层
本帖最后由 impossible 于 2016-8-18 09:39 编辑

是第一项到四百万项,还是最多是四百万值的项;
以下是第一项到四百万项的代码
#include <stdio.h>

#define min(a,b)        ((a)>(b)?(b):(a))
#define NUMWIDTH        250000
/*数组的空间,四百万项站多少位我也不知道,但我运行到20万项时数字写到文件时已经有37kb了
*如果超出这个空间就用vector
*我只放九位数字到一个int里,int最后一位放两数相加溢出的数字。数组的最后一个放当前数字站数组到哪一个int。
*/

inline void add(unsigned int *p1,unsigned int *p2);

int main()
{
        unsigned int loop=0,i,j[NUMWIDTH]={1},k[NUMWIDTH]={2},sum[NUMWIDTH]={0};
        j[NUMWIDTH-1]=0;
        k[NUMWIDTH-1]=0;
        sum[NUMWIDTH-1]=0;
       
        for(i=2;i<4000000;i+=2){
                if(k[0]%2==0){
                        add(sum,k);
                }
                add(j,k);
                if(j[0]%2==0){
                        add(sum,j);
                }
                add(k,j);
        }
        for(i=NUMWIDTH-2;i!=0;i--)
        {
                printf("%u",sum);
        }
        printf("\n");
        return 0;
}
inline void add(unsigned int *p1,unsigned int *p2)
{
        unsigned int loop=0;
       
        for(loop=0;loop<=min(p1[NUMWIDTH-1],p2[NUMWIDTH-1]);loop++){
                p1[loop]+=p2[loop];
                p1[loop+1]+=p2[loop]/1000000000;
        }
        if(p1[NUMWIDTH-1]<loop && p1[loop])p1[NUMWIDTH-1]=loop;
}
C:\Users\Administrator\Desktop\2.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-8-22 13:01:56 | 显示全部楼层
  1. #include<stdio.h>
  2. int main()
  3. {
  4.         unsigned long long i=0,j=1,g,sum=0;
  5.         int a;
  6.         for(a=0;a<=4000000;a++)
  7.         {
  8.                 g=i+j;
  9.                 i=j;j=g;
  10.                 //printf("%llu\n",g);
  11.                 if(g%2==0)
  12.                 {
  13.                         sum+=g;
  14.                 }
  15.         }
  16.         printf("和:%llu\n",sum);
  17.         return 0;
  18. }
复制代码

我的答案是6280710680130704614
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 0 反对 1

使用道具 举报

发表于 2016-8-22 14:27:38 | 显示全部楼层
  1. i = 0
  2. i1 = 0
  3. i2 = 1
  4. sum1 = 0
  5. while i < 4000000:
  6.    
  7.     if i%2 == 0:
  8.         sum1 += i
  9.    
  10.     i = i1 + i2
  11.     i2 = i1
  12.     i1 = i
  13. print(sum1)
  14. >>> 4613732
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-9-2 12:05:36 | 显示全部楼层
  1. def Our(x):
  2.       if x % 2:
  3.             return False
  4.       else:
  5.             return True
  6. def FBNQ():
  7.       a = 1;b = 1
  8.       list1 = []
  9.       while a < 4000000:
  10.             a,b=b,a+b
  11.             if Our(a):
  12.                   list1.append(a)
  13.       return sum(list1)
  14. if __name__=='__main__':
  15.       a = FBNQ()
  16.       print(a)
复制代码

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

使用道具 举报

发表于 2016-9-6 16:16:56 | 显示全部楼层
  1. #include <stdio.h>
  2. #include <stdlib.h>

  3. int main()
  4. {
  5.     long a[10000];
  6.     long i = 3;
  7.     a[1] = 1;
  8.     a[2] = 2;
  9.     long s = 2;
  10.     do
  11.         {
  12.                 a[i] = a[i-1] + a[i-2];
  13.                 if(a[i] % 2==0)
  14.                 {
  15.                         s+=a[i];
  16.                 }
  17.         }while(a[i++]<=4000000);
  18.         printf("%ld",s);
  19. }
复制代码


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

使用道具 举报

发表于 2016-9-27 11:26:28 | 显示全部楼层
  1. import java.util.ArrayList;
  2. import java.util.List;

  3. public class EvenFibonacciNumbers
  4. {
  5.         public static void main(String[] args)
  6.         {
  7.                 List<Integer> li = new ArrayList<Integer>();
  8.                
  9.                 li.add(1);
  10.                 li.add(2);
  11.                
  12.                 int sum = li.get(1);
  13.                
  14.                 int i = 2;
  15.                 while(li.get(i-1) + li.get(i-2) <= 4000000)
  16.                 {
  17.                         li.add(li.get(i-1) + li.get(i-2));
  18.                        
  19.                         if(li.get(i)%2 == 0)
  20.                                 sum += li.get(i);
  21.                        
  22.                         i++;       
  23.                 }
  24.                
  25.                 System.out.println("数值在400万内的斐波那契数中偶数的和为:" + sum);
  26.                
  27.         }
  28. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-9-29 11:03:48 | 显示全部楼层
  1. def fib(x):
  2.     if x == 0:
  3.         return 0
  4.     elif x == 1:
  5.         return 1
  6.     else:
  7.         return fib(x-2) + fib(x-1)

  8. def euler(upper_limit):
  9.     list_x = []
  10.     count = 0
  11.     while fib(count) <= upper_limit:
  12.         if not fib(count)%2:
  13.             list_x.append(fib(count))
  14.         count += 1
  15.     return sum(list_x)

  16. if __name__ == '__main__':
  17.     print(euler(4000000))
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-10-6 19:25:54 | 显示全部楼层
i = 1
j = 2
sum = 2
while True:
    k = i
    i = j
    j = i + k
    if j>4000000:
        break
    if j%2 == 0:
        sum = sum + j
print(sum)

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

使用道具 举报

发表于 2016-10-26 17:32:48 | 显示全部楼层
本帖最后由 joker11111 于 2016-10-26 17:34 编辑

  1. //-------------------------------------------
  2. //02--在斐波那契数列中,找到小于4百万的项为偶数的项之和
  3. //-------------------------------------------
  4. #include <windows.h>
  5. #include <iostream>
  6. #include <time.h>

  7. using namespace std;

  8. long int fun(int m);

  9. long int fibo(long int m);

  10. int main()
  11. {
  12.         clock_t start, finish;
  13.         double totaltime;
  14.         start = clock();

  15.         long int m = 4000000;
  16.         cout << " 结果为:" << fun(m) << endl;

  17.         finish = clock();
  18.         totaltime = (double)(finish - start) / CLOCKS_PER_SEC;
  19.         cout << "此程序的运行时间为" << totaltime << endl;
  20.         system("pause");
  21.         return 0;
  22. }

  23. long int fun(int m)
  24. {
  25.         long int s = 0, i = 1, fb = fibo(1);
  26.         while (fb < m)
  27.         {
  28.                 if (0 == fb % 2)
  29.                 {
  30.                         s += fb;
  31.                 }
  32.                 i++;
  33.                 fb = fibo(i);
  34.         }
  35.         return s;
  36. }

  37. long int fibo(long int m)
  38. {
  39.         while (m > 0)
  40.         {
  41.                 if (1 == m)
  42.                         return 1;
  43.                 else if (2 == m)
  44.                         return 2;
  45.                 else
  46.                         return fibo(m - 1) + fibo(m - 2);
  47.         }
  48. }

复制代码


结果为:4613732
运行时间为:0.828
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-10-28 16:13:20 | 显示全部楼层
  1.         var i = 1, y = 2, sum = 0;
  2.         while(true){

  3.                 if(!(y%2)){
  4.                         sum += y;
  5.                 }       
  6.                
  7.                 y = y + i;
  8.                 i = y - i;

  9.                 if(y > 4000000){
  10.                         break;
  11.                 }
  12.         }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-11-1 18:27:07 | 显示全部楼层
#include<iostream>
#include<stdlib.h>

using namespace std;

int facbosum(int n)
{
    int f1=1,f2=2,sum=2,f3=f1+f2;
    while(f3<n)
    {
        f3=f1+f2;
        f1=f2;
        f2=f3;
        if(f3%2==0)
        {
            sum+=f3;
        }
    }
    return sum;
}

int main()
{
    system("color 3f");
    cout<<facbosum(4000000);
}
结果是4613732
大家帮忙看看!!!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-11-2 17:01:00 | 显示全部楼层
本帖最后由 梦想绘制者 于 2016-11-2 17:03 编辑
  1. # Python 3.5实现
  2. # 求数值不超过4E6的斐波那契数列中偶数项的和
  3. # 代码思路:
  4. # 一变生成Fibonacci数列一边判断奇偶性同时求和
  5. # 由于递归算法在数据量大时效率低(且占用大量存储空间)于for/while循环,考虑使用循环算法

  6. def evenFib(nMax):
  7.     evenSum = 0
  8.     a = b = 1

  9.     while True:
  10.         a, b = b, a + b
  11.         if b < nMax:
  12.             if not(b % 2):
  13.                 evenSum += b
  14.         else:
  15.             break
  16.     return evenSum

  17. eFib = evenFib(4e6)
  18. print('Sum of even terms of Fibonacci sequence within 4 million is %d' %eFib)
复制代码


>>>
Sum of even terms of Fibonacci sequence within 4 million is 4613732
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-11-5 00:34:21 | 显示全部楼层
#include <stdio.h>
int main()
{
        int c=0,a=1,b=2,add=2;
        while (c<=4000000)
        {
                c=a+b;
                a=b;
                b=c;
                if (c%2==0)
                {
                        add=add+c;
                }
        }
       
printf("%d\n",add);
return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-11-6 21:34:42 | 显示全部楼层
  1. """
  2. 欧拉计划
  3. 找出斐波那契数列中数值不超过400万的项,求这些项中为偶数的项之和
  4. """
  5. fibo=[1,2]
  6. sum=2
  7. a=0
  8. while a<4000000:
  9.     lenf=len(fibo)
  10.     a=fibo[lenf-1]+fibo[lenf-2]
  11.     fibo.append(a)
  12.     if a%2==0:
  13.         sum=sum+a
  14. print("求和结果为:"+str(sum))
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-11-15 14:17:01 | 显示全部楼层
  1. def euler02(maxvalue=10000):
  2.     """
  3.     斐波那契数列中每一项被定义为前两项之和。从1和2开始,斐波那契数列的前十项为:
  4.     1,2,3,5,8,13,21,34,55,89,...
  5.     考虑斐波那契数列中数值不超过400万的项,找出这些项中值为偶数的项之和
  6.     """
  7.     fiblist = [1, 2]
  8.     while fiblist[-1]+fiblist[-2]<=maxvalue:
  9.         fiblist.append(fiblist[-1]+fiblist[-2])
  10.     return sum([n for n in fiblist if not n%2])

  11. print(euler02(maxvalue = 4000000))
复制代码


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

使用道具 举报

发表于 2016-11-18 12:54:30 | 显示全部楼层
本帖最后由 〃陌殇、怀素 于 2016-11-18 14:04 编辑

#include <stdio.h>
#include <stdlib.h>
#define MAX 4000000

int find()
{
    int i = 1,j = 2,sum = 0;
    int fibonacci = 0;        //斐波那契数

    for(;fibonacci < MAX ; )
    {

        fibonacci = i + j;
        i = j;
        j = fibonacci;
        if( fibonacci%2 == 0)
        {
            sum = fibonacci + sum;
        }
    }
    return sum;
}

void main()
{
    int sum = 0;
    sum = find();
    printf("不大于四百万的斐波那契数中,偶数项的和为:%d",sum);
    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-11-24 19:37:45 | 显示全部楼层
def fbnq():
        a=1
        b=2
        while b<=4000000:
                if b%2==0:
                        yield b
                a,b=b,a+b
c=fbnq()
sum(i for i in c)
4613732

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

使用道具 举报

发表于 2016-12-29 10:07:07 | 显示全部楼层
  1. a = 1
  2. b = 2
  3. i = 0
  4. summation = 0
  5. while i < 4000000:
  6.     i = a + b  #第3个数为前两数之和
  7.     a = b      #第2个数的值做为下次计算的第1个数
  8.     b = i      #将得到的值做为下次计算的第2个数
  9.     if i % 2 == 0:
  10.         summation += i
  11. print(summation + 2) #2没计算,加上
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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