斐波纳契系列中偶数项的总和不到400万

时间:2013-12-30 05:02:22

标签: c

////Even Fibonacci numbers
    int i=2;
    int sum_of_Even=0;
    int fib_array[]={};
    fib_array[0]=1;
    fib_array[1]=1; 
    while (fib_array[i]<4000000)
    {
        fib_array[i]=fib_array[i-1]+fib_array[i-2];
        if ((fib_array[i]%2) == 0)
        {
            sum_of_Even+=fib_array[i];
        }
         i++;
    }
    printf("sum of Even terms in the fib sequence = %i\n", sum_of_Even);

在终端上,输出为3 ..帮助!     程序看起来很好......但不知何故给出了3的输出(这是非常错的)..     打开如何解决这个问题的建议..     谢谢..

4 个答案:

答案 0 :(得分:5)

问题可能在这里:(无论如何,即使它不是 问题,这也是一个大问题。)

int fib_array[]={};

在内存中为您的阵列分配的空间不会像您预期的那样动态增长。你需要以某种方式为它管理内存。现在你正在大量涌入这个阵列,这个程序不会崩溃或断块,真是令人惊讶。

编辑此外,每次您的while循环检查其是否再次运行的条件时,它会访问您阵列中尚未进行的条目初始化!注意:

  • 在第一次运行时,它会检查您将要在循环体中设置的fib_array[2] < 4000000
  • 在第二次运行时,它会检查您将要在循环体中设置的fib_array[3] < 4000000

编辑2:由于(非常多)人发布了你需要使用64位整数并且这是你问题的根源,我想发表澄清的评论答案是在500万的范围内,所以32位整数很大。

答案 1 :(得分:0)

在while()测试中访问时,

fib_array [i]未初始化。设置fib_array [i]后,尝试将while循环更改为while(true)并在行上使用if (fib_array[i]<4000000) break;

另外,你的sum_of_Even需要是64位整数,所以你需要:

#include <stdint.h>

然后将其声明为uint64_t

另一个问题是你没有声明你的fib_array应该有多大,所以没有为它分配实际的内存。试试int fib_array[MAXSIZE];,其中MAXSIZE是您需要多少条目的计算。

答案 2 :(得分:0)

有关如何修复的建议:

注意@Andrey评论:
“为了记录:这是一个项目欧拉问题,人们强烈建议不要在网上发布解决方案。”

使用long long fib_array[3]数组。为了生成Fibonacci数,仅使用前2个来生成第3个。在生成Fibonacci数并测试均匀度之后,现在您有3个Fibonacci数,丢弃最年长并重复。


OP的当前int fib_array[]={};没有分配OP方法所需的数组。 fib_array[i]=导致UB。


根据@Jules解决方案,即使long可能不够,请考虑long long。无论如何,请使用匹配的prinf()格式说明符。编辑:结果答案是&lt; 5,000,000,因此long将起作用。

long sum_of_Even = 0;
....
printf("sum of Even terms in the fib sequence = %li\n", sum_of_Even);

答案 3 :(得分:-1)

#include <stdio.h>
#include <string.h>

int main()
{
    long i,s=0,f[50];
    f[0]=1;
    f[1]=1;
    for (i=2;f[i]<4000000;i++){
        f[i] = f[i-1] + f[i-2];
        if (f[i]%2 == 0){
            printf("%ld ",f[i]);
            s += f[i];
        }
    }
    printf("SUM = %ld\n",s);
    return 0;
}