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

誰可幫我一把(delphi問題) ,<- 請取一個有意義的標題

答題得分者是:eaglewolf
017911
一般會員


發表:5
回覆:2
積分:1
註冊:2007-07-08

發送簡訊給我
#1 引用回覆 回覆 發表時間:2007-11-08 19:42:29 IP:202.175.xxx.xxx 訂閱
尋找160以內的素數,它的倒序數(如123的倒序數為321)、數碼和 (如123的數碼和為1 2 3)、數碼積 (如123的數碼積為1*2*3) 不是素數便是1。

面版中只需有一個按鈕 , 只能用循環語句 如 ( if 循環 While-do循環 Repeat-until循環)
三種循環一起用都可 , 注意不能使用數組
編輯記錄
taishyang 重新編輯於 2007-11-12 14:35:56, 註解 無‧
jow
尊榮會員


發表:66
回覆:751
積分:1253
註冊:2002-03-13

發送簡訊給我
#2 引用回覆 回覆 發表時間:2007-11-08 22:13:27 IP:123.193.xxx.xxx 訂閱
這問題之前就解答過了,

http://delphi.ktop.com.tw/board.php?cid=30&fid=1498&tid=90789#4

原程式碼只要修改一下, 去除禁用的數組(陣列)
以及 for-loop 語法改變一下, 就應該可以了...

^_^


[code delphi]
procedure TForm1.Button1Click(Sender: TObject);

function IsPrime(X: Integer): Boolean;
var
I, Q: Integer;
begin
if X < 4 then Result := True
else begin
Result := True;
Q := Trunc(Sqrt(X)) 1;
for I := 2 to Q do
if X mod I = 0 then
begin
Result := False;
Break;
end;
end;
end;

function CheckCondition(X: Integer): Boolean;
var
S: string;
A, B, C, I: Integer;
begin
A := 1;
B := 0;//Sum
C := 1;//Mul
S := IntToStr(X);
I := Length(S);
repeat
A := A * 10 StrToInt(S[I]);
B := B StrToInt(S[I]);
C := C * StrToInt(S[I]);
Dec(I);
until I = 0;
Result := False;
if not IsPrime(A) then EXIT;
if not IsPrime(B) then EXIT;
if not IsPrime(C) then EXIT;
Result := True;
end;

procedure Print(Index, N: Integer);
var
S: string;
R: TRect;
W, H: Integer;
begin
S := IntToStr(N);
Canvas.Font.Name := 'ARIAL';
Canvas.Font.Height := 24;
Canvas.Font.Color := clBlue;
W := Canvas.TextWidth(S);
H := Canvas.TextHeight(S);
R := Rect(0,0,W,H);
OffsetRect(R,0,H*Index 1);
DrawText(Canvas.Handle,PChar(S),Length(S),R,DT_LEFT DT_SINGLELINE);
end;

var
I, N, Z: Integer;
begin
Z := 160;//最大數
I := 0;
N := 1;
repeat
if IsPrime(N) and CheckCondition(N) then
begin
Print(I, N);
Inc(I);
end;
Inc(N);
until N > Z;
end;

[/code]

===================引 用 017911 文 章===================
尋找160以內的素數,它的倒序數(如123的倒序數為321)、數碼和 (如123的數碼和為1 2 3)、數碼積 (如123的數碼積為1*2*3) 不是素數便是1。

面版中只需有一個按鈕 , 只能用循環語句 如 ( if 循環 While-do循環 Repeat-until循環)
三種循環一起用都可 , 注意不能使用數組
編輯記錄
jow 重新編輯於 2007-11-08 22:14:12, 註解 無‧
jow 重新編輯於 2007-11-08 22:16:10, 註解 無‧
eaglewolf
資深會員


發表:4
回覆:268
積分:429
註冊:2006-07-06

發送簡訊給我
#3 引用回覆 回覆 發表時間:2007-11-09 09:06:11 IP:211.75.xxx.xxx 訂閱
在素數(質數)的定義中 0 與1 不屬於素數
所以
IsPrime 跟 CheckCondition 這兩個函數要稍微修正
其它則不變

[code delphi]
function IsPrime(X: Integer): Boolean;
var
I, Q: Integer;
begin
if X < 2 then
begin
Result := False;
exit;
end;
if X < 4 then Result := True
else begin
Result := True;
Q := Trunc(Sqrt(X)) 1;
for I := 2 to Q do
if X mod I = 0 then
begin
Result := False;
Break;
end;
end;
end;

function CheckCondition(X: Integer): Boolean;
var
S: string;
A, B, C, I: Integer;
begin
A := 0;
B := 0;//Sum
C := 1;//Mul
S := IntToStr(X);
I := Length(S);
repeat
A := A * 10 StrToInt(S[I]);
B := B StrToInt(S[I]);
C := C * StrToInt(S[I]);
Dec(I);
until I = 0;
Result := False;
if not IsPrime(A) then EXIT;
if not IsPrime(B) then EXIT;
if not IsPrime(C) then EXIT;
Result := True;
end;

[/code]



===================引 用 jow 文 章===================
這問題之前就解答過了,

http://delphi.ktop.com.tw/board.php?cid=30&fid=1498&tid=90789#4

原程式碼只要修改一下, 去除禁用的數組(陣列)
以及 for-loop 語法改變一下, 就應該可以了...

^_^


[code delphi]
procedure TForm1.Button1Click(Sender: TObject);

function IsPrime(X: Integer): Boolean;
var
I, Q: Integer;
begin
if X < 4 then Result := True
else begin
Result := True;
Q := Trunc(Sqrt(X)) 1;
for I := 2 to Q do
if X mod I = 0 then
begin
Result := False;
Break;
end;
end;
end;

function CheckCondition(X: Integer): Boolean;
var
S: string;
A, B, C, I: Integer;
begin
A := 1;
B := 0;//Sum
C := 1;//Mul
S := IntToStr(X);
I := Length(S);
repeat
A := A * 10 StrToInt(S[I]);
B := B StrToInt(S[I]);
C := C * StrToInt(S[I]);
Dec(I);
until I = 0;
Result := False;
if not IsPrime(A) then EXIT;
if not IsPrime(B) then EXIT;
if not IsPrime(C) then EXIT;
Result := True;
end;

procedure Print(Index, N: Integer);
var
S: string;
R: TRect;
W, H: Integer;
begin
S := IntToStr(N);
Canvas.Font.Name := 'ARIAL';
Canvas.Font.Height := 24;
Canvas.Font.Color := clBlue;
W := Canvas.TextWidth(S);
H := Canvas.TextHeight(S);
R := Rect(0,0,W,H);
OffsetRect(R,0,H*Index 1);
DrawText(Canvas.Handle,PChar(S),Length(S),R,DT_LEFT DT_SINGLELINE);
end;

var
I, N, Z: Integer;
begin
Z := 160;//最大數
I := 0;
N := 1;
repeat
if IsPrime(N) and CheckCondition(N) then
begin
Print(I, N);
Inc(I);
end;
Inc(N);
until N > Z;
end;

[/code]

===================引 用 017911 文 章===================
尋找160以內的素數,它的倒序數(如123的倒序數為321)、數碼和 (如123的數碼和為1 2 3)、數碼積 (如123的數碼積為1*2*3) 不是素數便是1。

面版中只需有一個按鈕 , 只能用循環語句 如 ( if 循環 While-do循環 Repeat-until循環)
三種循環一起用都可 , 注意不能使用數組
------
先查HELP
再查GOOGLE
最後才發問

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

Developing Tool:
1.Delphi 6
2.Visual Studio 2005
3.Visual Studio 2008
DBMS:
MS-SQL
編輯記錄
eaglewolf 重新編輯於 2007-11-09 09:08:38, 註解 無‧
eaglewolf 重新編輯於 2007-11-09 09:25:19, 註解 無‧
eaglewolf 重新編輯於 2007-11-09 09:28:50, 註解 無‧
017911
一般會員


發表:5
回覆:2
積分:1
註冊:2007-07-08

發送簡訊給我
#4 引用回覆 回覆 發表時間:2007-11-12 19:17:33 IP:202.175.xxx.xxx 訂閱
thank you 我好滿意 ,我現在明白了
系統時間:2017-10-24 15:48:37
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!