雜湊和素數打表

2021-09-01 14:16:30 字數 1853 閱讀 6039

舉例子吧

乙個陣列a[7]=

然後再定義乙個a陣列中最大元素+1的陣列b[14]=;

for(i=0;i<7;i++)

b[a[i]]=1;

如果輸了乙個數w,則需要判斷b[w]是不是為1,如果是1,a陣列裡有這個數

舉例子吧

乙個陣列a[7]=

然後再定義乙個a陣列中最大元素+1的陣列b[14];

for(i=0;i<14;i++)

b[i]=-1;//將b陣列都初始化為-1

for(i=0;i<7;i++)

b[a[i]]=i;

如果輸了乙個數w,則需要判斷b[w]是不是-1,如果是-1,a陣列裡沒有這個數

如果b[w]不是-1,a陣列裡就有這個數w,b[w]就是這個數w在a陣列中的下標

素數打表,思路就是下面這個圖

先從2開始(1不是素數忽略)

把2標記為素數,然後把2的倍數都標記為非素數

然後讀2下乙個素數3,把3標為素數,把3的倍數標為非素數

讀到4,非素數,不處理,再讀5

把5標記為素數,把5的倍數標記為非素數

讀6,非素數,讀7,素數,把7的倍數標記為非素數

(這時候已經把2,3,5,7的倍數標記為非素數了,標記了一大半了)

以此類推

下面上**:

#include

#define n 1000000

intmain()

,x,y,i,j,k;

//陣列a初始化為0

for(i=

2; i

(!a[i]

)//a[i]==0就說明i是素數

for(j=i*i; j

=i) a[j]=1

;//將i的倍數標記為1;

for(i=

2; i

(a[i]==0

)printf

("%lld\n"

,i);

//輸出素數

return0;

}

還有一種:

#include

#define n 1000000

intmain()

,x,y,i,j,k;

//陣列a初始化為0

for(i=

2; i

(!a[i]

)//a[i]==0就說明i是素數

for(j=i+i; j

=i) a[j]=1

;//將i的倍數標記為1;

for(i=

2; i

(a[i]==0

)printf

("%lld\n"

,i);

//輸出素數

return0;

}

上面兩個**的區別:

for

(j=i*i; j

=i) a[j]=1

;//將i的倍數標記為1;

/**********************/

for(j=i+i; j

=i) a[j]=1

;//將i的倍數標記為1;

第二個**,i+i會出現這種問題:

比如6,10

6在讀2的時候標記了非素數

6又在讀3的時候標記了非素數

重複標記了兩次

同樣10也被重複標記了兩次,分別是2和5的時候

而第乙個**,i*i就不會出現這種情況

孿生素數(素數打表,字首和)

time limit 2 sec memory limit 128 mb 2013年5月華人數學家張益康在 數學年刊 中發表的一篇 解決世界性數學難題 孿生素數猜想。所謂孿生素數指的就是這種間隔為 2 的相鄰素數,它們之間的距離已經近得不能再近了,就象孿生兄弟一樣。最小的孿生素數是 3,5 在 10...

美素數 素數打表

description 小明對數的研究比較熱愛,一談到數,腦子裡就湧現出好多數的問題,今天,小明想考考你對素數的認識。問題是這樣的 乙個十進位制數,如果是素數,而且它的各位數字和也是素數,則稱之為 美素數 如29,本身是素數,而且2 9 11也是素數,所以它是美素數。給定乙個區間,你能計算出這個區間...

高效素數打表

大家所知的素數打表時間複雜度幾乎都是n2。就是這種 void init prime j 0 for i 2 i 1000002 i if prime i prime j i 在網上搜到了另一種方法,效率提高了不少。巧妙之處還在研究中,等理解差不多就仔細分析一下。下面是 大家可以發表一下自己的看法,交...