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...