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 億のアイテムです。各反復が CPU に対して 100 の命令を必要とすると (寛大に) しましょう。これは約30 兆の命令を意味し、2.5 GHz プロセッサでは約 1000 秒 (15 分) で完了します。

編集#2

2時間後、完成です。結果は15次のとおりです。

  • 71
  • 839
  • 1471年
  • 6857
  • 59569
  • 104441
  • 486847
  • 1234169
  • 5753023
  • 10086647
  • 87625999
  • 408464633
  • 716151937
  • 8462696833
于 2012-09-01T04:05:09.677 に答える
0

私はJavaのmewbieですが、「int」を追加しているにもかかわらず、「double」のリストを作成することが問題になる可能性があります。「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」が原因で、「ゼロが double を除算しようとしています」という行に沿ってエラーをスローしました。見てみな。

編集:

上記が初当たりです。i がゼロに等しい場合を回避すると、さらに先のことになります。

'dBaseman' が言ったように、いつかマイナス値に達します。マイナスは mod 操作で常に 0 を生成します (何でも % -i =0)。したがって、-1 から -2147483648 までのすべての整数値 (これは整数の負の範囲です) は、リストに 1 つの要素を追加します。

次に、私は肯定的な側に来ます(再び、ケース i をゼロとして回避していることに注意してください)。ここでも、いくつかの仕切りがリストにロードされます。

しばらくすると、再びマイナス側に入り、2147483648 個の要素が追加されます。リストのカウントが short int の最大値を超えています。

したがって、整数であることを気にしてカウントを呼び出すと、1バイトが割り当てられますが、読み取るものは doubleです。ここでは適切な変換が行われていないため、出力はゼロです(私の仮定)。.Net は、リスト数が int の制限を超えることはないと想定していたのかもしれません。これが役立つことを願っています。

于 2012-09-01T05:15:11.720 に答える