这个c程序中的"long long "有什么问题?

what is wrong with "long long " in this c program?

#include<stdio.h>
#include<conio.h>
void main()
{
    long long sum=2,x=1,y=2,z=0,i;
    for(i=2;i<200000;i++)
    {
        z=x+y;
        y=y+z;
        x=z;
        if(z%2==0)
            sum+=z;
if(y%2==0)
sum+=y;
    }
    printf("%lld",sum);
    getch();
}

偶数斐波那契数相加。 它在 i<200000 时正常工作,但当我将限制再增加一位时,它显示否定答案。我试过 "unsigned long long" 和 "long long int " 但我没有得到正确答案.. 请帮助我...

你应该打印总和:

printf("%lld\n", sum);

printf("%lld"); 将打印垃圾值

如果这不是问题所在,那么您实际上无法对 i<2000000 的斐波那契数求和。

因为:

对于 i<20000 你的程序会给你一个总和,它实际上是一个 8359 位数。现在 i<2000000 呢?这将占用大量时间和内存。我认为你实际上并没有这样做。这样做是不可行的。

最后,您的程序根本没有生成斐波那契数

printf() 应该改为

printf("%lld\n",sum);

unsinged long long的范围是

0 to 18,446,744,073,709,551,615

long long的范围是

–9,223,372,036,854,775,808 to 9,223,372,036,854,775,807

在您的情况下,输出将导致整数溢出,因此当您在 for 循环中向检查值 (20000000) 添加一位数字时,您会得到负值,这最终会导致未定义的行为。

您说代码在您请求 i < 20000000 之前一直有效。这是我认为正在发生的事情:我相信您遇到了溢出错误。我知道你从 signed long long 切换到 unsigned long long 这确实使数字的可能范围翻了一番,但即便如此,即使总和只是偶数,2000 万次斐波那契迭代也很多。

如果你真的需要一个精确的解决方案来解决像 2000 万这样大的项,你将无法依赖标准 C。你将不得不找到一个替代库。您应该搜索处理 Arbitrary Precision.

的库

我会推荐 GNU Multiple Precision Arithmetic Library (GMP). More details about this library can be found on this Wikipedia page。 GMP 可以为您提供仅受可用 RAM 限制的精度。但是,请记住,大量计算是以大量处理时间为代价的。

我在 Java 中使用 Java 的 BigInteger class 解决了与此类似的问题,但问题的核心是一样的。你只需要任意精度。