1樓:匿名使用者
這是**,後面有**的說明
program zhishu;
const max=50100;
var a:array[1..max]of 0..1;
b:array[1..2,1..10000]of longint;
n,i,j,k:longint;
begin
assign(input,'zhishu.in'); reset(input);
assign(output,'zhishu.out'); rewrite(output);
fillchar(a,sizeof(a),1);
a[1]:=0; k:=0;
for i:=2 to max do
if a[i]=1 then
begin
k:=k+1; b[1,k]:=i; b[2,k-1]:=b[1,k]-b[1,k-1];
for j:=2 to max div i do
a[j*i]:=0;
end;
repeat
readln(n);
if n=0 then break;
for i:=1 to k-1 do
if b[2,i]=n+1 then begin writeln(b[1,i]+1); break; end;
if i=k then writeln(b[1,i]+1);
until n=0;
close(input); close(output);
end.
在給**之前,為了便於理解,我先說明一些東西
陣列a :若a[i]=0則說明 i 是質數,等於1為合數,因質數範圍在50000之內, 設陣列a是為了找出質數
找的方法是篩選法.並且將
我試用了檔案,其實你只要把
①第k個質數存入b[1,k];
②那麼b[1,k]和b[1,k-1]則是相鄰的兩個質數.並且將這兩個質數的差存在b[2,k-1]之中 (顯然這時的k>1)
③之所以存起他們的差,是因為 若n個相鄰的合數中最小的是 x,則最大的是x+n-1那麼他們兩邊的質數應該是 x-1 和 x+n且這兩個質數是相鄰的質數,且他們的差事 n+1
④所以只要從b[2,1], b[2,2], b[2,3]……開始逐一往後比較b[2,i]一個的值是 n+1 那麼,與這個對應的 b[1,i]+1就是問題的解了
自己編的**,且一字一字敲的,而且還說明了.我打字速度只有20字每分鐘,望採納!!!!!!
2樓:匿名使用者
從2~50000內用篩選法搞出所有素數(其他方法也行,只要不超時)兩個素數間的必然是連續合數,掃描一遍所有素數,處理出連續長度為k的合數中最小數放在f陣列。
這些處理完後,每對於個輸入只要輸出f[k]就行了。
樓主,求加分啊!
3樓:匿名使用者
先找素數;
然後一個個相鄰的素數檢視,是的就輸出,反正只有50000
鄰接表用陣列實現(Pascal)
如果是有向邊那麼不需要雙倍,如果是無向邊就需要雙倍。這取決於你在搜尋的時候,是否要求一條邊兩端的點能搜到對方。如果是spfa的話,需要雙倍。加邊的時候 add i,j,k add j,i,k type edge record point,next,len longint end a array 1....
pascal過程呼叫問題
procedure wh1 i integer procedure wh2 i integer begin if i 100 then begin wh1 i 1 writeln 0 i end end begin if i 100 then begin wh2 i 1 writeln i end ...
PHP陣列問題,請教php陣列問題
使用php內部函式array rand,不多做解釋了 array rand 從陣列中隨機取出一個或多個單元這樣是返回一個包含隨機鍵名的陣列,通過這個陣列,獲取對應的值.如下,給你寫了個函式,封裝了下array rand,使之返回隨機元素function getrandarray array,num ...