int main()
}
return
0;
}
輸入:maxp數學歸納法:輸出:[0 maxp]區間中所有的質數。
初始狀態:0,1不是質數,標記isnotprime [0]=1, isnotprime[1]=1。 先假設除了0,1以外的數i均為質數,標記isnotprime[i]=0。
演算法對每乙個數i
1):如果i是素數,則將i加入到prime陣列中,篩除每乙個數prime[j]*i(i*prime[j] < maxp)。
2) : 如果i是合數,則i=
px11
∗px2
2∗px
33∗p
x44∗
…∗px
nn=(
x1,x
2,x3
,x4…
xn) ,(其中pi
為從小到大排列的質數),進一步的可以寫成i=
pxmi
n∗q ,當pr
ime[
j]<=pm
in時,篩除每乙個合數prime[j]*i (i*prime[j] < maxp),break—退出內迴圈。
當i=2時,isnotprime[2]=0,!isnotprime[2]為真,所以第12行條件判斷為真,prime[0]=2, 2為質數, 被加入到陣列prime中。p(2) hold假設當i=k時p(k) hold,則p(k+1)hold:
證明p(k+1)hold: 反證
法:假設p(k+1)不能保持,由於p(k)hold,所以區間[0 k]之間的質數和合數都已確定下來,因此要使p(k+1)不能hold,則要麼數k+1作為質數被篩除;要麼作為合數卻未被篩除。下面將證明這兩點都不滿足,所以假設(p(k+1)不能保持)不成立,假設(p(i) hold)成立,證畢。
證明:命題m:要麼數k+1作為質數被篩除;要麼作為合數卻未被篩除這兩點在上述情況下不能被滿足。
找素數(質數) 線性篩法和埃氏篩法
先看這道題 洛谷p1217回文質數 對於這道題,普通的暴力模擬會tle,所以得尋求改進。這裡我學會了兩種方法 第一種 線性篩法 這種演算法的核心思想就是 任何乙個合數都可以由質數相乘得到 下面就是核心 吃透了核心 就可以在其中新增點細節,然後就可以拿去解決問題了 這裡需要開多大的陣列取決自己 boo...
質數線性篩法 O n
埃氏篩法o nloglogn 仍會重複標記合數 such as i 2時 12 2 6,先會被 2 標記已是合數 i 3時 12 3 4,又被標記了一次 我們在生成乙個需要標記的合數時,每次只向現有的數中乘上乙個質因子,並且讓它是所生成合數的最小質因子 code include include us...
求質數3 線性篩法 C實現
該問題出自 c語言名題精選百則技巧篇 從2開始,先刪除2 2,2 2 2,2 2 2 2,接著刪除2 3,2 2 3 2 2 2 3,3並沒有被刪除 再刪除2 5,2 2 5,2 2 2 5,然後刪除2 7,2 2 7,2 2 2 7,然後是2 9,2 2 9,2 2 2 9,當發現p是乙個質數的時...