在这个c程序中“long long”有什么问题?

时间:2015-01-01 19:13:28

标签: c

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

加上偶数Fibonacci数字。它适用于i&lt; 200000但是当我将限制增加一个数字时,它显示为否定答案。我试过&#34; unsigned long long&#34; &#34; long long int&#34;但我没有得到正确答案..请帮帮我......

3 个答案:

答案 0 :(得分:3)

你应该打印总和:

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

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

如果这不是问题,那么你实际上甚至不能算出i<2000000的斐波纳契数。

由于:

对于i<20000,您的计划会为您提供一笔实际为 8359 位数的金额。那么i<2000000呢?这将花费大量的时间和记忆。我想你实际上并没有这样做。这是不可行的。

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

答案 1 :(得分:2)

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

如果您确实需要一个超过2000万这么大的精确解决方案,那么您将无法依赖标准C.您将不得不寻找替代库。您应该搜索处理任意精度的库。

我会推荐 GNU Multiple Precision Arithmetic Library (GMP) 。有关此库的更多详细信息,请参见this Wikipedia page。 GMP可以为您提供仅受可用RAM限制的精度。但是,请记住,大量计算需要花费大量处理时间。

我使用Java的BigInteger类在Java中克服了类似的问题,但问题的核心是完全相同的。你只需要任意精确度。

答案 2 :(得分:1)

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)时,您将获得负值,这最终将导致未定义的行为。