为什么list.count在此代码中返回0

时间:2012-09-01 04:01:07

标签: c# .net loops infinite-loop

我想找到这个数字的所有因子并将因子存储到一个列表中,但这个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();
    }
}

3 个答案:

答案 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

  • 71
  • 839
  • 1471
  • 6857
  • 59569
  • 104441
  • 486847
  • 1234169
  • 5753023
  • 10086647
  • 87625999
  • 408464633
  • 716151937
  • 8462696833

答案 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限制。我希望这会有所帮助。