請問我的程式哪裡假設有問題 |
尚未結案
|
mp6dk284
一般會員 發表:4 回覆:8 積分:2 註冊:2004-12-10 發送簡訊給我 |
以下是一個判斷是否為質數的程式:
procedure TForm1.Button1Click(Sender: TObject);
var i,xNo:integer;
begin
xNo:=StrToInt(edit1.text);
for i:=2 to xNo do begin;
if (xNo mod 2 = 0) or (xNo mod 3 =0)
or (xNo mod 5 =0) or (xNo mod 7=0)
then
label1.caption:=IntToStr(xNo) 'no'
else
label1.caption:=IntToStr(xNo) 'yes'
end;
if (xNo=1) then label1.caption:=IntToStr(xNo) 'no';
if (xNo =2) or (xNo= 3)
or (xNo=5) or (xNo=7)then
label1.caption:=IntToStr(xNo) 'yes' end; 我輸入121,結果程式判斷會是質數ㄋ??
請問哪邊有問題ㄋ??
請各大高手解惑...
|
Wesly
中階會員 發表:14 回覆:103 積分:53 註冊:2002-05-31 發送簡訊給我 |
var i, xNo: integer; begin xNo := StrToInt(edit1.text); for i := 2 to xNo do begin; if (xNo mod 2 = 0) or (xNo mod 3 = 0) or (xNo mod 5 = 0) or (xNo mod 7 = 0) or (xNo mod 11 = 0) or (xNo mod 13 = 0) then label1.caption := IntToStr(xNo) ' no' else label1.caption := IntToStr(xNo) ' yes' end; if (xNo = 1) then label1.caption := IntToStr(xNo) ' no'; if (xNo = 2) or (xNo = 3) or (xNo = 5) or (xNo = 7) or (xNo = 11) or (xNo = 13) then label1.caption := IntToStr(xNo) ' yes' end;基本上你的方法不是一個好方法, 原因是採用固定的質數去測試, 若輸入的數目不是在指定的質數中, 就測不出來了, 所以121測不出來就是這個原因 |
mp6dk284
一般會員 發表:4 回覆:8 積分:2 註冊:2004-12-10 發送簡訊給我 |
|
Wesly
中階會員 發表:14 回覆:103 積分:53 註冊:2002-05-31 發送簡訊給我 |
|
Wesly
中階會員 發表:14 回覆:103 積分:53 註冊:2002-05-31 發送簡訊給我 |
|
mp6dk284
一般會員 發表:4 回覆:8 積分:2 註冊:2004-12-10 發送簡訊給我 |
|
mp6dk284
一般會員 發表:4 回覆:8 積分:2 註冊:2004-12-10 發送簡訊給我 |
|
mp6dk284
一般會員 發表:4 回覆:8 積分:2 註冊:2004-12-10 發送簡訊給我 |
|
deity
尊榮會員 發表:90 回覆:876 積分:678 註冊:2003-05-09 發送簡訊給我 |
mp6dk284您好:
小弟插一个花:
小弟在那篇文章有说到,要判断一个数是否是质数。因为任何一个自然数都不可能被比它大的自然数整除,所以要判断一个自然数是否为质数,只要看它能否被比它小的自然数(当然除1之外)整除,所以您要判断121是不是质数,就得判断它是否能被2~120整除,,若只要存在能被一个自然数整除则就不是质数,否则是质数。另一方法,若一个自然数n不是质数,则必然能表示成两个自然数n1和n2之积,并且其中之一必然小于等于sqrt(n),另一个必然大于等于qrt(n)。所以要判断一个自然数n是否为素数,可简化为判断它能否被2至sqrt(n)之间的自然数整除根据这一原则,您如果要判断19的平方(19*19)能表示成等于两个sqrt(361)自然数的积,所以它不是质数,如需判断则还得加上两个判断条件,即能否被17或19整除,而19的平方当然能被19整除,所以它不是质数,而您上面程式条件不够,所以会出错,当然如果下次想判断121的平方,那不是得写几十个判断条件,手都软了,呵呵,所以您可以采用如下方法,根据第二种判断方法,改为如下:
procedure TForm1.Button1Click(Sender: TObject); var i, xNo: integer; begin xNo := StrToInt(edit1.text); for i := 2 to trunc(sqrt(xNo)) do begin if (xNo mod i)=0 then label1.caption := IntToStr(xNo) ' no' else label1.caption := IntToStr(xNo) ' yes' end; if (xNo = 1) then label1.caption := IntToStr(xNo) ' no';//1不是质数 if (xNo = 2) or (xNo = 3) then label1.caption := IntToStr(xNo) ' yes';//2为最小质数,3取平均后取整,上面循环判断不了,直接写 > ——行径窄处,留一步与人行—— 發表人 - |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |