因此,我一直在尝试用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位或更多的数字后,它才开始执行此操作。但由于我需要这么高的数字,修复或类似的将非常感谢。我还是个初学者。谢谢!
发布于 2018-07-30 22:56:22
我强烈怀疑这个问题是整数溢出。num是64位整数,而i是32位整数。如果num大于int.MaxValue,那么当您递增i时,它将最终溢出回到负值,然后最终为0……这时num % i将抛出。
最简单的选择是将i改为long:
for (long i = 1; i < num; i++)不幸的是,您的原始代码中没有任何警告- i在需要的地方被提升为long,因为存在从int到long的隐式转换。我不清楚需要做什么改变才能在语言本身中发现这一点。对于Roslyn分析器来说,注意到这类问题会更简单。
https://stackoverflow.com/questions/51596726
复制相似问题