1

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

3 回答 3

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
于 2012-09-01T04:05:09.677 回答
0

我是java中的新手,但问题可能是您为“double”创建了列表,但是您正在添加一些“int”。尝试为“int”创建列表。

List<int> listOfFactors = new List<int>();
于 2012-09-01T04:30:44.663 回答
0

我不认为实际上你运行这个程序直到最后或者你的调试有问题,我通过像这样将它除以 2 进一步减少了 num

for(int i=1;i<=(num/2);++i)

当 i 越过 dbaseman 指示的整数限制时,它有一次达到零,然后由于“600851475143 % i”,它沿着“零试图除以双精度数”的行抛出错误。看看这个。

编辑:

以上是第一击。如果你避免了 i 等于 0 的情况,那么这里就更进一步了。

正如'dBaseman'所说,它会在某个时候达到负值。在 mod 操作中,减号总是产生 0(任何 % -i =0)。因此,从 -1 到 -2147483648(这是整数的负数范围)的所有整数值都将产生在列表中添加一个元素。

然后我会采取积极的态度(再次记住,你正在避免将我的情况设为零)。现在它再次将一些分隔符加载到列表中。

一段时间后,它会再次进入负面状态,填充将继续添加更多 2147483648 元素。现在列表的计数超过了 short int 的最大值。

因此,当您调用 count 时介意它是一个整数,它将分配一个字节,但它读取的内容是 double。所以输出为零,因为这里没有发生适当的转换(我的假设)。也许 .Net 假设列表计数永远不会超过 int 限制。我希望这有帮助。

于 2012-09-01T05:15:11.720 回答