求一段區間內素數的個數

2021-07-10 17:30:01 字數 1892 閱讀 9136

csu1030: 素數槽

description

處於相鄰的兩個素數p和

p + n

之間的n - 

1個連續的合數所組成的序列我們將其稱為長度為

n的素數槽。例如,‹

24, 25, 26, 27,28

›是處於素數

23和素數

29之間的乙個長度為

6的素數槽。

你的任務就是寫乙個程式來計算包含整數

k的素數槽的長度。如果

k本身就是素數,那麼認為包含

k的素數槽的長度為0。

input

第一行是乙個數字

n,表示需要測試的資料的個數。後面有

n行,每行是乙個正整數k,

k大於1並且小於或等於的第十萬個素數(也就是

1299709)。

output

對於輸入部分輸入的每乙個

k,都對應輸出乙個非負整數,表示包含

k的素數槽的長度,每個非負整數佔一行。

sample input5

10 11

27 2

492170

sample output4

0 6

0 114

1;做這題之前剛好看完了素數打表;所以很快就ac了;因此我覺得這題的關鍵就是素數打表;

2;然而很多人都是超時,這就與打表的有效性有關了;時間空間的使用程度不是最優的吧;

3;介紹素數打表;

vis[100000] = ;

scanf(「%d」,&n);

m = sqrt(n + 0.5);

for(i = 2; i <=m; i++)}}

是不是很很蒙的感覺;剛開始我也是這樣的。讓我來解釋一下吧;

2;是素數,則2*2, 2*4,2*8,………直到2*2……這些都不是素數,

3;是素數,則3*3, 3*6,3*9,…………直到3*……這些都不是素數,

5;是素數,則5*5, 5*10,5*15,………直到5*……這些都不是素數,

這個規律就是上面那種篩選法的思路;

1先將陣列vis【】都初始化為0;也就是最初將所有數假定義為素數

2進行上面所說的篩選;將已經確定不是素數的數的陣列定義為1;

3則可以確定了 0 為素數 ; 1 為 合數;

4;注意這不是到n;截止而是sqrt(n+0.5);這裡也就節約了時間;

這是一種素數打表;也是該題應該使用的打表方法;但這種就不能標記素數的位置;

因此當我們要標記素數字置時就要用另外一種;

len = 1;

for(i = 2; i <= n; i++) }

}素數打表介紹了這麼多應該懂了吧;

現在我們再來看題目;分為2步;

1;判斷這個數是不是素數;如果是則直接輸出0;

2如果不是;則要從該數開始上下進行搜尋;直到vis==0;就結束;

看**吧;

#include

#include

#include

int vis[1299711]= ;

int main()

} }

/*for(i = 2; i <= m; i++)

if(vis[i] == 0)

printf("%lld ",i);*/

scanf("%lld",&n);

while(n--)

for(i = t-1; ; i--) }

for(i = t+1; ; i++) }

printf("%lld\n",end-st); }

return 0 ; }

篩素數,求區間內素數個數

問題 1525 藍橋杯 演算法提高vip 找素數 時間限制 1sec 記憶體限制 128mb 提交 1179 解決 133 題目描述 給定區間 l,r 請計算區間中素數的個數。資料規模和約定 2 l r 2147483647 r l 1000000 輸入兩個數l和r。輸出一行,區間中素數的個數。樣例...

判斷區間內的素數個數

package method public class stest package method 編寫乙個有兩個執行緒的程式,第乙個執行緒用來計算2 100000之間的素數的個數,第二個執行緒用來計算100000 200000之間的素數的個數,最後輸出結果 author administrator ...

埃氏篩法求給定區間內素數個數

題目原型 給定整數a,b,請問區間內有多少個素數?應對策略 預備知識 埃氏篩法 思想是首先預設所有數都是素數,然後從2開始,對每個數字進行遍 歷,如果該數字是素數,那麼它的倍數就不是素數,與單獨判斷每個 數字是不是素數相比,如此可以大大減少判斷素數的時間。int prime max n bool i...