如何在.net中对非常大的数字进行正确的计算

时间:2016-06-18 06:25:19

标签: c# .net

我在执行正确的计算时遇到问题,因为结果溢出所以函数没有返回正确的答案。

public static UInt64 findNwords(UInt64 nletters, UInt64 length)
{
    if (nletters == 1) return 1;

    UInt64 half1 =  nletters / 2;
    UInt64 half2 = nletters - half1;

    UInt64 loc0 = half1;
    UInt64 loc1 = half2;
    UInt64 curr = 1;

    for (UInt64 i = 1; i < length; i++)
    {
        curr = (loc0 + loc1);
        loc0 = loc1;
        loc1 = curr;
    }

    return (curr * half2) % 100000007;
}

致电findNwords(1000, 500)应该返回6109294。就我而言,它正在返回19610514。请帮忙。

1 个答案:

答案 0 :(得分:1)

您的程序在迭代79处溢出64位空间。您可以通过使用for封装checked - 循环来轻松地对此进行测试 - 块:

checked
{
    for (UInt64 i = 1; i < length; i++)
    {
        curr = (loc0 + loc1);
        loc0 = loc1;
        loc1 = curr;
    }
}

如果在操作期间一个值溢出,则会抛出异常。除了使用较低的值或使用System.Numerics.BigInteger而不是UInt64更改算法之外,您无法对此做任何事情。第二种解决方案要求您添加System.Numerics程序集作为参考。通过这样做,算法为您的示例返回 6109294 的预期值。