全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:3779
推到 Plurk!
推到 Facebook!

判斷質數的程式,出現overflow?

答題得分者是:P.D.
ladies
一般會員


發表:7
回覆:18
積分:5
註冊:2007-08-29

發送簡訊給我
#1 引用回覆 回覆 發表時間:2007-08-31 13:56:23 IP:59.120.xxx.xxx 訂閱
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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2007-08-31 14:52:30 IP:59.125.xxx.xxx 訂閱
可能是遞迴太多層導致的 overflow
改成不用遞迴的寫法試試吧
------
歡迎參訪 "腦殘賤貓的備忘錄" http://maolaoda.blogspot.com/
anyone
中階會員


發表:1
回覆:63
積分:52
註冊:2007-02-12

發送簡訊給我
#3 引用回覆 回覆 發表時間:2007-08-31 16:14:15 IP:59.127.xxx.xxx 未訂閱
你提供的程式碼怪怪的
N小於等3都質數了,還往下跳= =
你是不是Copy錯?
ladies
一般會員


發表:7
回覆:18
積分:5
註冊:2007-08-29

發送簡訊給我
#4 引用回覆 回覆 發表時間:2007-08-31 16:44:44 IP:59.120.xxx.xxx 訂閱
我也覺得很奇怪,不知道哪裡出錯!!!
P.D.
版主


發表:603
回覆:4038
積分:3874
註冊:2006-10-31

發送簡訊給我
#5 引用回覆 回覆 發表時間:2007-08-31 19:18:14 IP:61.67.xxx.xxx 未訂閱
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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2007-09-04 09:25:57 IP:59.120.xxx.xxx 訂閱
謝謝P.D大大指點,已經想出解決的方法了!
程式也達到我想要的要求了。
3Q.......(大心)^^
編輯記錄
ladies 重新編輯於 2007-09-04 09:27:28, 註解 無‧
P.D.
版主


發表:603
回覆:4038
積分:3874
註冊:2006-10-31

發送簡訊給我
#7 引用回覆 回覆 發表時間:2007-09-04 09:45:29 IP:61.67.xxx.xxx 未訂閱
我的程式如下,並不是很完美,但提供你做參考
<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

發送簡訊給我
#8 引用回覆 回覆 發表時間:2007-09-04 10:32:51 IP:59.120.xxx.xxx 訂閱
<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

發送簡訊給我
#9 引用回覆 回覆 發表時間:2007-09-04 20:58:17 IP:220.132.xxx.xxx 訂閱
嚴謹一點的話
質數的定義是若一個大於1的整數,滿足除了1和自己之外,沒有其他的因數,則該數為質數。
另外再判斷是否為質數時,不需要算到N-1,只要算到N的開根號即可。
------
先查HELP
再查GOOGLE
最後才發問

沒人有義務替你解答問題
在標題或文章中標明很急
並不會增加網友回答速度

Developing Tool:
1.Delphi 6
2.Visual Studio 2005
3.Visual Studio 2008
DBMS:
MS-SQL
系統時間:2024-04-20 12:01:18
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!