C 斐波那契数列中偶数项之和小于400万 ///偶数斐波那契数 int i=2; 偶数的整数和=0; int fib_数组[]={}; fib_数组[0]=1; fib_数组[1]=1; 而(fib_array[i]

C 斐波那契数列中偶数项之和小于400万 ///偶数斐波那契数 int i=2; 偶数的整数和=0; int fib_数组[]={}; fib_数组[0]=1; fib_数组[1]=1; 而(fib_array[i],c,C,这里可能存在问题:(无论如何,这是一个大问题,即使它不是问题。) 内存中为阵列分配的空间不会像您预期的那样动态增长。您需要以某种方式管理它的内存。现在,您正在大量溢出此阵列,令人惊讶的是,此程序没有崩溃或出现故障 编辑:此外,每次while循环检查是否再次运行时,它都会访问数组中尚未初始化的项!注意: 在第一次运行时,它检查您将要在循环体中设置的fib_数组[2]格式说明符。编辑:答案是“5000000”,所以长< /C> >将工作。 #include <stdio.h> #inc

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

内存中为阵列分配的空间不会像您预期的那样动态增长。您需要以某种方式管理它的内存。现在,您正在大量溢出此阵列,令人惊讶的是,此程序没有崩溃或出现故障

编辑:此外,每次
while
循环检查是否再次运行时,它都会访问数组中尚未初始化的项!注意:

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

编辑2:由于(令人惊讶的是)很多人都在发帖说你需要使用64位整数,而这正是你问题的根源,我想澄清一点,答案在500万范围内,所以32位整数非常大。

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

内存中为阵列分配的空间不会像您预期的那样动态增长。您需要以某种方式管理它的内存。现在,您正在大量溢出此阵列,令人惊讶的是,此程序没有崩溃或出现故障

编辑:此外,每次
while
循环检查是否再次运行时,它都会访问数组中尚未初始化的项!注意:

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

编辑2:由于(令人惊讶的是)很多人都在发帖说您需要使用64位整数,而这正是问题的根源,我想澄清一点,答案在500万范围内,所以32位整数非常大。

当您在while()中访问fib_数组[I]时,它没有初始化测试。尝试将while循环更改为
while(true)
,并使用
if(fib_数组[i]fib_数组[i]在while()测试中访问它时未初始化。尝试将while循环更改为
while(true)
,并使用
if(fib_数组[i]
)\include
#包括
int main()
{
长i,s=0,f[50];
f[0]=1;
f[1]=1;
对于(i=2;f[i]
#包括
#包括
int main()
{
长i,s=0,f[50];
f[0]=1;
f[1]=1;

对于(i=2;f[i]关于如何修复的建议:

注意@Andrey评论:

请注意:这是一个Project Euler问题,强烈建议人们不要在网上发布解决方案

使用
long long fib_array[3]
数组。要生成斐波那契数,只有前2个用于生成第3个。生成斐波那契数并测试均匀度后,现在您有3个斐波那契数,请丢弃最大的,然后重复


OP的当前
int fib_数组[]={};
未分配OP接近所需的数组。
fib_数组[i]=
导致UB


每@朱勒解决方案,即使是<代码>长可能是不够的,考虑<代码>长Lo/<代码>。在任何情况下,使用匹配<代码> PROFF()/代码>格式说明符。编辑:答案是“5000000”,所以<代码>长< /C> >将工作。

#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;
}

关于如何修复的建议:

注意@Andrey评论:

请注意:这是一个Project Euler问题,强烈建议人们不要在网上发布解决方案

使用
long long fib_array[3]
数组。要生成斐波那契数,只有前2个用于生成第3个。生成斐波那契数并测试均匀度后,现在您有3个斐波那契数,请丢弃最大的,然后重复


OP的当前
int fib_数组[]={};
未分配OP接近所需的数组。
fib_数组[i]=
导致UB


每@朱勒解决方案,即使是<代码>长可能是不够的,考虑<代码>长Lo/<代码>。在任何情况下,使用匹配<代码> PROFF()/代码>格式说明符。编辑:答案是“5000000”,所以<代码>长< /C> >将工作。

#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;
}

fib_数组的大小是多少?您能发布完整的代码吗?请发布更多的代码。这里有一个简单的提示,int没有足够的精度来存储许多fibonacci值。请尝试求和到序列中的下一个数字(大于4000000)而不是高达4000000,并查看结果是否发生变化。如果发生变化,则可以确定int无法包含结果。请注意:这是一个Project Euler问题,强烈建议人们不要将解决方案发布到网上。@MarcB C
int
s不是16位的。这与实现有关,但几乎与实现无关任何现代实现都有至少32位大小的
int
s。fib_数组的大小是多少?你能发布完整的代码吗?请发布更多的代码。这里有一个简单的提示,int没有足够的精度来存储许多fibonacci值。尝试将序列中的下一个数字相加(大于4000000)而不是高达4000000,并查看结果是否发生变化。如果发生变化,则可以确定int无法包含结果。请注意:这是一个Project Euler问题,强烈建议人们不要将解决方案发布到这些在线解决方案。
#include <stdint.h>
#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;
}
long sum_of_Even = 0;
....
printf("sum of Even terms in the fib sequence = %li\n", sum_of_Even);