C# % 抛出 DivideByZeroException
C# % throws DivideByZeroException
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%i 不会抛出任何错误,因为 i 大于或等于 1,但它确实会抛出该错误。
我按以下方式使用了这两种方法:
Console.WriteLine(getHighestPrime(getDenoms(600851475143)));
对代码抛出该错误的原因有任何见解吗?
原因是 600851475143
对于 int
!
太大
您的循环变量 i
是 int
,但您将其与 long
进行比较。 600851475143
大于 int.MaxValue
,所以 i
最终溢出并在 int.MinValue
重新开始。然后它增加,直到它再次 0
瞧:
DivideByZeroException
要解决此问题,请将循环变量的类型也更改为 long
:
for (long i = 1; i < n; i++)
'i' 是一个整数,因为 'n' 很长,所以在 for 循环中 'i' 溢出并在一段时间后达到 '0' 值。
修复:
for (long i = 1; i < n; i++)
我自己没有测试过,但是当我查看你的代码时,我发现你的循环使用的是 int 变量,而你的输入是 long 。您用来测试函数的数字 600851475143 大于 32 位 int 可以表示的数字。尝试将变量 i 更改为 long.
失败的原因是你的值600851475143
大于int.MaxValue
解决这个问题继续用long
代替int
注意long.MaxValue是:9223372036854775807
查看下面的代码
public static List<long> getDenoms(long n)
{
List<long> result = new List<long>();
for (long i = 1; i < n; i++)
{
if (n % i == 0)
{
result.Add(i);
}
}
return result;
}
public static long getHighestPrime(List<long> seq)
{
int currentHigh = 1;
foreach (long number in seq)
{
List<long> temp = getDenoms(number);
if (temp.Count == 1)
{
if (number > currentHigh)
{
currentHigh = number;
}
}
}
return currentHigh;
}
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%i 不会抛出任何错误,因为 i 大于或等于 1,但它确实会抛出该错误。
我按以下方式使用了这两种方法:
Console.WriteLine(getHighestPrime(getDenoms(600851475143)));
对代码抛出该错误的原因有任何见解吗?
原因是 600851475143
对于 int
!
您的循环变量 i
是 int
,但您将其与 long
进行比较。 600851475143
大于 int.MaxValue
,所以 i
最终溢出并在 int.MinValue
重新开始。然后它增加,直到它再次 0
瞧:
DivideByZeroException
要解决此问题,请将循环变量的类型也更改为 long
:
for (long i = 1; i < n; i++)
'i' 是一个整数,因为 'n' 很长,所以在 for 循环中 'i' 溢出并在一段时间后达到 '0' 值。
修复: for (long i = 1; i < n; i++)
我自己没有测试过,但是当我查看你的代码时,我发现你的循环使用的是 int 变量,而你的输入是 long 。您用来测试函数的数字 600851475143 大于 32 位 int 可以表示的数字。尝试将变量 i 更改为 long.
失败的原因是你的值600851475143
大于int.MaxValue
解决这个问题继续用long
代替int
注意long.MaxValue是:9223372036854775807
查看下面的代码
public static List<long> getDenoms(long n)
{
List<long> result = new List<long>();
for (long i = 1; i < n; i++)
{
if (n % i == 0)
{
result.Add(i);
}
}
return result;
}
public static long getHighestPrime(List<long> seq)
{
int currentHigh = 1;
foreach (long number in seq)
{
List<long> temp = getDenoms(number);
if (temp.Count == 1)
{
if (number > currentHigh)
{
currentHigh = number;
}
}
}
return currentHigh;
}