我在执行正确的计算时遇到问题,因为结果溢出所以函数没有返回正确的答案。
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
。请帮忙。
答案 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 的预期值。