#2582: 此題做法?


awpkiller (討厭不跟範例輸入的測資(吼))

學校 : 不指定學校
編號 : 7937
來源 : [202.40.139.107, 175.159.107.90]
最後登入時間 :
2013-02-27 19:40:50
d362. 10394 - Twin Primes -- UVa10394 | From: [61.18.109.87] | 發表日期 : 2009-11-01 18:57

我想問應該用哪一種方法較快阿?

因為我用愛氏去找出所有質數(3,20000000)

之後就找出第N對twins primes

但用愛氏就會TLE(3s),之後我就想爆出100000對twins prime,但那個文字檔有3MB多,結果我放棄了

那麼請問有什麼好的方法嗎?

 

以下是我的程式碼

 

program twin_prime; const max=20000000; var prime:array[3..max] of boolean; n,i,j,count:longint; procedure find_prime; //all prime[i] are true first var temp:longint; begin i:=3; while i<=max do begin if prime[i] then begin temp:=max div i; j:=3; while j<=temp do begin prime[i*j]:=false; j:=j+2; end; end; i:=i+2; end; end; begin for i:= 3 to max do prime[i]:=true; find_prime; while not eof do begin readln(n); count:=0; i:=3; while i<=max-2 do begin if ((prime[i]) and (prime[i+2])) then inc(count); if count=n then break; i:=i+2; end; writeln('(',i,' ',i+2,')'); end; 

end. 

請賜教 

 
#2589: Re:此題做法?


awpkiller (討厭不跟範例輸入的測資(吼))

學校 : 不指定學校
編號 : 7937
來源 : [202.40.139.107, 175.159.107.90]
最後登入時間 :
2013-02-27 19:40:50
d362. 10394 - Twin Primes -- UVa10394 | From: [61.18.109.87] | 發表日期 : 2009-11-03 00:11

program twin_prime; const max=20000000; var prime:array[3..max] of boolean; n,i,j,count:longint; output:text; procedure find_prime; //all prime[i] are true first var temp:longint; begin i:=3; while i<=max do begin if prime[i] then begin temp:=max div i; j:=3; while j<=temp do begin prime[i*j]:=false; j:=j+2; end; end; i:=i+2; end; end; begin for i:= 3 to max do prime[i]:=true; find_prime; assign(output,'a.txt'); rewrite(output); count:=0; i:=3; while count<=100000 do begin writeln(count); if ((prime[i]) and (prime[i+2])) then begin inc(count); writeln(output,count,':writeln(''(',i,' ',i+2,')'');'); end; i:=i+2; end; close(output); end.
這樣子比較好看~對不起~ 
 
#2590: Re:此題做法?


awpkiller (討厭不跟範例輸入的測資(吼))

學校 : 不指定學校
編號 : 7937
來源 : [202.40.139.107, 175.159.107.90]
最後登入時間 :
2013-02-27 19:40:50
d362. 10394 - Twin Primes -- UVa10394 | From: [61.18.109.87] | 發表日期 : 2009-11-03 00:16

program twin_prime;

const max=20000000;

var prime:array[3..max] of boolean;

n,i,j,count:longint;

procedure find_prime; //all prime[i] are true first

var temp:longint;

begin

i:=3;

while i<=max do

begin

if prime[i] then

begin

temp:=max div i;

j:=3;

while j<=temp do

begin

prime[i*j]:=false;

j:=j+2;

end;

end;

i:=i+2;

end;

end;

begin

for i:= 3 to max do

prime[i]:=true;

find_prime;

while not eof do

begin

readln(n);

count:=0;

i:=3;

while i<=max-2 do

begin

if ((prime[i]) and (prime[i+2])) then inc(count);

if count=n then break;

i:=i+2;

end;

  writeln('(',i,' ',i+2,')');

end;

end.

程式碼輸出終於弄好-.-

 
ZeroJudge Forum