nyoj26 孿生素數問題

2021-07-05 23:28:03 字數 1925 閱讀 4962

時間限制:

3000 ms  |  記憶體限制:

65535 kb

難度:3 描述

寫乙個程式,找出給出素數範圍內的所有孿生素數的組數。一般來說,孿生素數就是指兩個素數距離為2,近的不能再近的相鄰素數。有些童鞋一看到題就開始寫程式,不仔細看題,咱們為了遏制一下讀題不認真仔細的童鞋,規定,兩個素數相鄰為1的也成為孿生素數。

輸入第一行給出n(0輸出

每組測試資料輸出佔一行,該行為m範圍內所有孿生素陣列數。

樣例輸入

1

14

樣例輸出

4

大概看了一下該題的執行結果,沒有通過的主要是因為超時。優化一下就可以了,打個**記錄一下,就可以解決這個問題了。

(1)把所有輸入資料儲存起來,並且記錄最大的輸入資料。

(2)根據最大值生成素數表,和孿生表(生成素數最大不超過最大輸入資料)

素數表su[78500]=

孿生表pr[78500]=

利用前面的素數表求後面的素數,加快求素數效率。每求出來乙個素數,要和之前求出的素數求差,如果差小於2,孿生表的值等於前乙個的值加一,否則等於前乙個值。

假設求出了第i個素數s

su[i]=s,pr[i]=su[i]-su[i-1]<=2 ? pr[i-1]+1:pr[i-1];

(3)

打好表之後,把儲存好的資料乙個乙個的處理,假設第乙個資料是 16

採用二分查詢從素數表中定位不大於16的最大素數的位置5,該位置對應的素數是13,輸出pr[5]即可。

**如下:

01.//孿生素數問題

02.#include

03.intsu[78500]=;

04.boolsushu(inta)   //根據前面的素數快速判斷當前數是否是素數

05.

11.intmain()

12.;

14.inti,j=5,k,n,m,p,q,max=0;

15.scanf("%d",&n);

16.for(i=0;i

17.

21.for(i=13;i

22.if(sushu(i))

23.

29.for(i=0;i

30.

39.if(su[q]<=test[i])p=q;

40.printf("%d\n",pr[p]);

41.}

42.}

NYoj 26 孿生素數問題

孿生素數問題 時間限制 3000 ms 記憶體限制 65535 kb 難度 3 描述 寫乙個程式,找出給出素數範圍內的所有孿生素數的組數。一般來說,孿生素數就是指兩個素數距離為2,近的不能再近的相鄰素數。有些童鞋一看到題就開始寫程式,不仔細看題,咱們為了遏制一下讀題不認真仔細的童鞋,規定,兩個素數相...

nyoj26 孿生素數問題

時間限制 3000 ms 記憶體限制 65535 kb 難度 3 描述 寫乙個程式,找出給出素數範圍內的所有孿生素數的組數。一般來說,孿生素數就是指兩個素數距離為2,近的不能再近的相鄰素數。有些童鞋一看到題就開始寫程式,不仔細看題,咱們為了遏制一下讀題不認真仔細的童鞋,規定,兩個素數相鄰為1的也成為...

nyoj 26孿生素數問題

孿生素數問題 時間限制 3000 ms 記憶體限制 65535 kb 難度 3 描述 寫乙個程式,找出給出素數範圍內的所有孿生素數的組數。一般來說,孿生素數就是指兩個素數距離為2,近的不能再近的相鄰素數。有些童鞋一看到題就開始寫程式,不仔細看題,咱們為了遏制一下讀題不認真仔細的童鞋,規定,兩個素數相...