37181の謎

解決


あきお  2002-02-06 01:11:11  No: 529  IP: [192.*.*.*]

簡単な素数判定のプログラムを作って遊んでいたのですが、なぜかいつも37181という数値でエラーが出るわけでもなく普通に計算が終わっています。ちなみにこんな感じのプログラムです。
procedure TForm1.Button1Click(Sender: TObject) ;

var i,j,n           : Cardinal ;
    Ret,Ret1,Ret2   : Integer  ;
begin

  if Edit1.Text <> '' then  {エディットに文字が入力されてる場合}
    begin
      Ret1 := GetTickCount ;
      n := StrToInt(Edit1.Text) ;

      for i := 2 to n do
        begin
          for j := 2 to i do
            begin
              if (i mod j) = 0 then break ;
              
              if j = (i div 2) + 1 then
                Memo1.Lines.Add(IntToStr(i));
            end;
        end;

      Ret2 := GetTickCount ;

      Ret := Ret2 - Ret1 ;

      Memo1.Lines.Add('計算時間 ' +IntToStr(Ret) +' (ms)');

    end;
end;

なぜ計算が終わってしまうのでしょうか?

編集    削除
にしの  2002-02-06 06:46:35  No: 530  IP: [192.*.*.*]

詳しく書いていないのでわかりませんが、エラーが出なくてよいのでは?
それとも、全角数字を入れたのにエラーが出ないのはなぜかってことでしょうか。
オプションで、例外を無視するようにするとエラーが出なかったような・・・。
「こんな感じ」がどんな感じなのかわかりませんが、僕のところでは13万くらいまでは計算できていました。
# それ以上は見ていません。計算中に停止させました

環境依存かもしれないので、詳しく書かれたほうがよいです。
少なくとも、37181を半角で入力したときは、「エラーもなく計算終了」しましたから。
この動作で正しいですよね?

編集    削除
あきお  2002-02-06 09:51:34  No: 531  IP: [192.*.*.*]

たとえば半角で5万と入力したときに49999は素数となるはずなんですがやっぱり37181で計算終了しているようです。最初は学校のPC(WIN me,Delphi6 personal)でやってみてだめで、家に持って帰って実行させて見ましたがやはり同じ数値で計算終了してしまっています。家のPCはWIN98でデルファイ6のパーソナルです。現在根本的にアルゴリズムのミスがないのか検討中です。

編集    削除
ナゾナゾくん  2002-02-06 14:06:02  No: 532  IP: [192.*.*.*]

【TMemo の謎】

サンプルコードでは、ループの中に
Application.ProcessMessages;
が入っていないので、
本来ループを抜けなければコントロールの表示は更新されない。
Edit2.Text := IntToStr(i);
をループの中に入れてみれば、Edit2の表示が更新されないのが確認できる。

ただし、なぜか TMemo は Application.ProcessMessages; が入っていなくても
ループ中で表示が更新される。
これが TMemo の謎。


【37181(途中)で終わるように見える原因】

TMemo の表示文字数に上限がある。
それを超えるとTMemo の表示は更新されない。

TMemo の更新が止まっても、まだループは終わらずに回っているので、
ループの中にブレークポイントを入れればプログラムはそこで停止するはず。

または、2重ループの外側の iループの中に
Edit2.Text := IntToStr(i);
Application.ProcessMessages;
を入れてみれば Memo の表示が止まっても
Edit2 が引き続きカウントアップされているのがわかるはず。

編集    削除
あきお  2002-02-06 23:25:52  No: 533  IP: [192.*.*.*]

なるほど、TMemoの表示文字数の限界でしたか。もっと大きい数字まで見たいと思ったらTStringListに計算結果を入れておいて、テキストファイルに保存すればよいのですよね。

編集    削除
ナゾナゾくん  2002-02-07 08:10:06  No: 534  IP: [192.*.*.*]

TStringListの上限は 2GBだったかな?
WinNT系の TMemoの上限も 2GB?
Win9x系の TMemoの上限は 16bitコントロールなので 64KB?

編集    削除