ACM 素數線性篩法(素數打表)

2021-08-14 20:58:07 字數 1738 閱讀 4514

題目**:

#include 

#include

int prime[700000];

bool check[10000000];

int num = 1;

int judge(int

y) int j = 0;

while(p[j] != -1)

j++;

j--;

i = 0;

while (i <= j)

i++,j--;

}return1;}

int main()

int j = 1;

for ( ; j < num; j++)

check[prime[j]*i] = 1;

if(i % prime[j] == 0)

break;}}

int a,b;

while (~scanf("%d

%d", &a, &b))

}for (i = j; prime[i] <= b && i < num; i++)

}printf("\n");

}return

0;}

用prime來儲存素數,但如何確定小於x範圍內素數的大致個數?最簡單的公式為x/lnx。但算出的結果是不準確的,大於有百分之幾的誤差,x越大時誤差越小。

用check陣列來標記所有數,初始化為0,若發現下標是合數,空間內放1;

陣列的型別可以定義為bool型別,這道題裡如果是int型,空間會超,而bool型別會省很多空間,因為在32位平台c/c++,int為4位元組,而bool為1位元組(c語言沒有bool型別,需要引標頭檔案,c++有,無需引標頭檔案,但無論c還是c++,大小都是1位元組)。

題目給出的範圍是1-100000000,但計算時看了下結果,10000000-99999999範圍內沒有符合的數,所以我們可以將範圍縮小為原來的十分之一(可能會有別的更好地處理方法)。

素數篩法的中心模組在於以下**:

int i = 2;

for ( ; i < 10000000; i++)

// 無論這個數是否為素數,都將它一定範圍內的倍數試除

int j = 1;

// j小於等於已有素數的下標(由於前面為num自增,所以這裡不需要等號)

for ( ; j < num; j++)

check[prime[j]*i] = 1;

if(i % prime[j] == 0) // 這一句很關鍵,解析較長寫下面

break;

}}

素數回文

xiaoou33對既是素數又是回文的數特別感興趣。比如說151既是素數又是個回文。現在xiaoou333想要你幫助他找出某個範圍內的素數回文數,請你寫個程式找出 a 跟b 之間滿足條件的數。(5 <= a < b <= 100,000,000);

input

這裡有許多組資料,每組包括兩組資料a跟b。

output

對每一組資料,按從小到大輸出a,b之間所有滿足條件的素數回文數(包括a跟b)每組資料之後空一行。

sample input

5 500

sample output

5 7

11 101

131

151

181

191

313

353

373

383

素數篩法打表

篩法打素數表是一種高效的打表方法,具體做法是 先把n個自然數按次序排列起來。1不是質數,也不是合數,要划去。第二個數2是質數留下來,而把2後面所有能被2整除的數都劃去。2後面第乙個沒劃去的數是3,把3留下,再把3後面所有能被3整除的數都劃去。3後面第乙個沒劃去的數是5,把5留下,再把5後面所有能被5...

素數打表 篩法

打表 是一種典型的用空間換時間的做法,一般指將所有可能需要用到的結果事先計算出來,這樣以後後面需要用到時就可以直接查表獲得。在什麼情況下我們需要打表?1 在程式中一次性計算出所有需要用到的結果,之後查詢直接取這些結果。舉個例子,假如我們算fibonacci數中的f n 我們假如需要算很多次q次 比如...

素數篩法(素數篩 線性篩)

求素數的方法在現階段可以總結為三種 這種方法最為簡單但效率太低,經過優化時間複雜度最低是o n sqrt n 輸入乙個n,輸出n以內所有素數 include intprime int n if flag 0 優化 printf d i intmain 素數篩法原理 2是素數,那麼2的所有倍數都是合數...