判斷質數的程式,出現overflow? |
答題得分者是:P.D.
|
ladies
一般會員 發表:7 回覆:18 積分:5 註冊:2007-08-29 發送簡訊給我 |
1. 使用的 Delphi 版本( v5)
2. 完整的程式範例(總不能叫大家用猜的吧!) function TForm1.prime(N: Integer):Integer; var i: Integer; begin if N <= 3 then begin Edit2.Text:= IntToStr(N) '是質數'; end else N:= 3; for i:= 1 to 100 do begin N:= N 2; if (N mod i) = 0 then begin Edit2.Text:= IntToStr(N) '不是質數'; end else Result:= prime(N); end; Edit2.Text:= IntToStr(N) '是質數'; end; procedure TForm1.Button1Click(Sender: TObject); var N: Integer; begin N:= StrToInt(Edit1.Text); prime(N); end; 以上是我的主要的程式碼,可以執行,但是會出現overflow的錯誤。 主要是讓user輸入一個值,然後判斷質數與否! 請問我的程式哪裡出現錯誤呢? 只是一個delphi的初學者,希望前輩們能夠解惑。 |
sryang
尊榮會員 發表:39 回覆:762 積分:920 註冊:2002-06-27 發送簡訊給我 |
|
anyone
中階會員 發表:1 回覆:63 積分:52 註冊:2007-02-12 發送簡訊給我 |
|
ladies
一般會員 發表:7 回覆:18 積分:5 註冊:2007-08-29 發送簡訊給我 |
|
P.D.
版主 發表:603 回覆:4038 積分:3874 註冊:2006-10-31 發送簡訊給我 |
1.不知道你對質數的定義是否很清楚?
2.所請質數是只能被1 及本身整除,所以你使用mod 是沒有錯,但為何在你的程式中一定要由1 to 100 的計算呢? 3.建議你程式碼要有縮排,比較容易懂 4.之所以會出現over flow 就是因為你使用function回值 result:= 的句子放在 for next 之中,要知道 result 是一個function得到最終結果值然後置入記憶堆疊中,結果你不斷讓 for next 一直填入 result 值,當然就會出現 overflow 5.依你的程式,其實回應值已做在function之中,根本無須再回值回去,所以使用procedure 就可以了 如果是 7 , 只要計算2 to 6 中,如果沒有其他被整除的因子就是質數,所以你是否有線索呢? 你的程式我實作後(經過修改)可以做到你想要的結果, 不過我還是希望你再仔細想一下, 下周我再公佈答案 |
ladies
一般會員 發表:7 回覆:18 積分:5 註冊:2007-08-29 發送簡訊給我 |
|
P.D.
版主 發表:603 回覆:4038 積分:3874 註冊:2006-10-31 發送簡訊給我 |
我的程式如下,並不是很完美,但提供你做參考
<textarea class="delphi" rows="10" cols="60" name="code">type TForm1 = class(TForm) Button1: TButton; Edit1: TEdit; Edit2: TEdit; procedure Button1Click(Sender: TObject); private { Private declarations } procedure prime(N: Integer); public { Public declarations } end; var Form1: TForm1; implementation {$R *.DFM} procedure TForm1.prime(N: Integer); var i: Integer; ISprime: boolean; begin ISprime:= True; for i:= 2 to N-1 do begin if (N mod i) = 0 then begin ISprime:= False; break; end; end; if ISprime then Edit2.Text:= IntToStr(N) '是質數' else Edit2.Text:= IntToStr(N) '不是質數'; end; procedure TForm1.Button1Click(Sender: TObject); begin prime(StrToInt(Edit1.Text)); end; end. </textarea> ===================引 用 ladies 文 章=================== 謝謝P.D大大指點,已經想出解決的方法了! 程式也達到我想要的要求了。 3Q.......(大心)^^ |
ladies
一般會員 發表:7 回覆:18 積分:5 註冊:2007-08-29 發送簡訊給我 |
<textarea class="delphi" rows="10" cols="60" name="code">procedure TForm1.Button1Click(Sender: TObject);
var
N: Integer;
begin
N:= StrToInt(Edit1.Text);
prime(N);
end;
procedure TForm1.prime(N: Integer);
var
i: Integer;
begin
if N <= 3 then begin
Edit2.Text:= IntToStr(N) '是質數';
end else
if (N mod 2) = 0 then begin
Edit2.Text:= IntToStr(N) '為偶數,不是質數';
end else begin
i:= 3;
if (N mod i) <> 0 then begin
for i:= 3 to (N div 2) do
end else begin
if (N mod i) = 0 then begin
Edit2.Text:= IntToStr(N) '不是質數';
end else begin
Edit2.Text:= IntToStr(N) '是質數';
end;
end;
end;
end;
</textarea>
這是我今天早上才改好,可能有些地方有點多餘。 初學程式的人真的要腳踏實地最重要。 雖然一個很簡單的問題,但我確想了兩天。 但是寫出來後真的很開心,多謝版大的提醒。 看了PD大大的程式,發現要學習的還很多很多,一定會成為這邊的常客。
編輯記錄
ladies 重新編輯於 2007-09-04 10:34:44, 註解 無‧
|
eaglewolf
資深會員 發表:4 回覆:268 積分:429 註冊:2006-07-06 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |