我想找到这个数字的所有因子并将因子存储到一个列表中,但这个list.count返回零
List<double> listOfFactors = new List<double>();
public void FindFactors()
{
double num = 600851475143 / 2;
for (int i = 1; i <= num; i++)
{
if (600851475143 % i == 0)
{
listOfFactors.Add(i);
}
}
}
主要功能代码
class Program
{
static void Main(string[] args)
{
Calculate cl = new Calculate();
cl.FindFactors();
}
}
答案 0 :(得分:6)
此代码陷入无限循环。原因是此处num
为300425737571,但int
的最大值为2147483647. for循环永远不会结束。
Console.WriteLine(int.MaxValue);
Console.WriteLine(int.MaxValue+1);
2147483647
-2147483648
编辑#1
这是3000亿件物品。让我们(慷慨地)说每次迭代都需要100条CPU指令。这意味着大约 30万亿指令,2.5GHz处理器上的指令应该在大约1000秒(15分钟)内完成。
编辑#2
两小时后,它完成了。您会很高兴知道结果是15
:
答案 1 :(得分:0)
我是java中的mewbie,但问题可能是你创建了“double”的列表,但是你添加了一些“int”。尝试为“int”创建列表。
List<int> listOfFactors = new List<int>();
答案 2 :(得分:0)
我不认为实际上你直到最后运行这个程序或者你的调试有问题,我把这个数字除以这两个就把它减去了
for(int i=1;i<=(num/2);++i)
当i超过dbaseman所指示的整数限制时,它一度达到零,然后由于“600851475143%i”,它会沿着“零试图划分双倍”的行引发错误。看看吧。
修改强>
以上是第一次打击。如果你在i等于零的情况下避免这种情况,那么这里就越远了。
正如'dBaseman'所说,它会在某个时间达到负值。 减号总是在mod操作中产生0(任何%-i = 0)。因此,从-1到-2147483648(这是整数的负范围)的所有整数值都将在列表中添加一个元素。
然后我会回到正面(再次记住,你正在避免我的情况为零)。现在它再次将一些分隔符加载到列表中。
经过一段时间后,它将再次进入负面,填充将继续添加更多2147483648元素。现在列表的计数超过了short int的最大值。
所以当你调用count来表示它是一个整数时,它将分配一个字节,但它读取的东西是双。因此输出为零,因为这里没有发生正确的转换(我的假设)。也许.Net假设列表计数永远不会超出int限制。我希望这会有所帮助。