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

請問我的程式哪裡假設有問題

尚未結案
mp6dk284
一般會員


發表:4
回覆:8
積分:2
註冊:2004-12-10

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-12-16 11:17:52 IP:203.64.xxx.xxx 未訂閱
以下是一個判斷是否為質數的程式: 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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-12-16 11:27:18 IP:218.170.xxx.xxx 未訂閱
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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-12-16 11:43:21 IP:203.64.xxx.xxx 未訂閱
那我程式應該如何修正ㄋ?? 我鋼鋼測試過如果輸入19的平方~還是出現yes 我該怎ㄇ把程式修正到最正確ㄋ??
Wesly
中階會員


發表:14
回覆:103
積分:53
註冊:2002-05-31

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-12-16 12:43:54 IP:218.170.xxx.xxx 未訂閱
要求質數本來就是一件不容易的事, 特別是大質數, 現代密碼數很多就是利用大質數的困難度來做金鑰 你可以參考 http://delphi.ktop.com.tw/topic.php?topic_id=53591 可以多利用搜尋功能, 找找看網上有那些先進已經解決的問題
Wesly
中階會員


發表:14
回覆:103
積分:53
註冊:2002-05-31

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-12-16 12:49:02 IP:218.170.xxx.xxx 未訂閱
另外看在我比你大的份上, 多動動腦, 因為我已指出你的方法是在指定固定已知的質數, 若沒有指定那就測不出來, 所以你應該在這個方面上去想想看, 功力才會有所進步.
mp6dk284
一般會員


發表:4
回覆:8
積分:2
註冊:2004-12-10

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-12-16 16:45:31 IP:203.64.xxx.xxx 未訂閱
看完了你所留下的提示~也看過那篇文章...ㄑ思考了一個下午...還是不知道如何解出那把"質數的KEY"?? 目前處於初學階段~還希望您能更明白地指出我ㄉ疑惑!! 程式的基本架構..迴圈..搞的我頭痛...
mp6dk284
一般會員


發表:4
回覆:8
積分:2
註冊:2004-12-10

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-12-16 20:34:34 IP:203.64.xxx.xxx 未訂閱
請高手能不吝嗇的指點一下....
mp6dk284
一般會員


發表:4
回覆:8
積分:2
註冊:2004-12-10

發送簡訊給我
#8 引用回覆 回覆 發表時間:2004-12-16 20:34:55 IP:203.64.xxx.xxx 未訂閱
請各位高手能不吝嗇的指點一下....
deity
尊榮會員


發表:90
回覆:876
積分:678
註冊:2003-05-09

發送簡訊給我
#9 引用回覆 回覆 發表時間:2004-12-17 09:28:07 IP:218.15.xxx.xxx 未訂閱
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取平均后取整,上面循环判断不了,直接写    >    ——行径窄处,留一步与人行——    發表人 - 
        
系統時間:2024-07-01 8:33:58
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!