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!

太大

您的循环变量 iint,但您将其与 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;
}