C#中高位数的System.DivideByZeroException

时间:2018-07-30 14:51:37

标签: c#

所以我一直试图用C#编写一个程序,该程序返回给定数字的所有因子(我将在以后实现用户输入)。该程序如下所示:

//Number to divide
long num = 600851475143;

//initializes list
List<long> list = new List<long>();

//Defines combined variable for later output
var combined = string.Join(", ", list);

for (int i = 1; i < num; i++)
{
    if (num % i == 0)
    {
        list.Add(i);
        Console.WriteLine(i);
    }
}

但是,一段时间后,程序也开始尝试对负数进行除法,该负数在一段时间后以System.DivideByZeroException结尾。我不清楚为什么要这么做。仅在“ num”变量包含11位或更多数字之后,才开始执行此操作。但是由于我需要这么高的数量,因此非常希望提供解决方案或类似方案。我还是一个初学者。 谢谢!

1 个答案:

答案 0 :(得分:7)

我强烈怀疑问题是整数溢出。 num是64位整数,而i是32位整数。如果num大于int.MaxValue,则当您增加i时,它将最终溢出回到负值,然后最终变为0 ...,此时num % i将抛出

最简单的选择就是将i更改为long

for (long i = 1; i < num; i++)

很遗憾,您的原始代码中没有警告-i被提升到了long所需要的位置,因为从int到{{ 1}}。对于我来说,尚不清楚需要进行哪些更改才能在语言本身中发现这一点。 Roslyn分析仪注意到这种问题会更简单。