public static List<int> getDenoms(long n)
{
List<int> result = new List<int>();
for (int i = 1; i < n; i++)
{
if (n % i == 0)
{
result.Add(i);
}
}
return result;
}
public static int getHighestPrime(List<int> seq)
{
int currentHigh = 1;
foreach (int number in seq)
{
List<int> temp = getDenoms(number);
if (temp.Count == 1)
{
if (number > currentHigh)
{
currentHigh = number;
}
}
}
return currentHigh;
}我有当前代码在C#中运行。我有两种方法。在getDenoms方法中,我假设语句n%我不会抛出任何错误,因为我大于或等于1,但是它确实抛出了该错误。
我使用这两种方法的方式如下:
Console.WriteLine(getHighestPrime(getDenoms(600851475143)));对于为什么代码会抛出错误有任何深入的见解吗?
发布于 2016-05-25 12:35:25
原因是600851475143是太大的而不是int!
循环变量i是int,但将其与long进行比较。600851475143大于int.MaxValue,因此i最终在int.MinValue上溢出并重新启动。然后它会增加,直到它再次成为0和voilá:
DivideByZeroException
要解决这个问题,也要将循环变量的类型更改为long:
for (long i = 1; i < n; i++)发布于 2016-05-25 12:39:21
'i‘是一个整数,因为'n’是长的,所以在for冰柱'i‘溢出,过一段时间到达'0’值。
Fix: for (长i= 1;i< n;i++)
发布于 2016-05-25 12:39:28
我自己还没有测试过这一点,但是当我查看您的代码时,我发现您的循环使用的是int变量,而您的输入是长的。您正在测试函数的数字,即600851475143,比32位int所能表示的要大。试着把你的变量I改为long。
https://stackoverflow.com/questions/37437198
复制相似问题