素數簡介:質數是指在大於1的自然數中,除了1和它本身以外不再有其他因數的自然數。
素數1、素數的普通解法 直接上**
import mathl=[
2]n=int
(input
("請輸入所求素數的上限:"))
for x in
range(1
,n):
for i in
range(2
,x):
if x%i==0:
break
else
:pass
#只需除到x的根號 挨著除完效率低
if(i>math.sqrt(x)):
#if(i==x-1): 效果一樣
# print(x,",是乙個素數")
break
print
(l)
這種方法求小一點的素數範圍還行,如果數大一點就很慢了。比如輸入n為1000000或者更大,上述方法效率就非常低了,執行時間太長。那怎麼快速的求解呢,請看下面。
2、篩選法求解素數(埃拉託色尼篩選法)
具體原理:
計算素數的乙個方法是埃氏篩法,它的演算法理解起來非常簡單:
首先,列出從2開始的所有自然數,構造乙個序列:
2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, …
取序列的第乙個數2,它一定是素數,然後用2把序列的2的倍數篩掉:
3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, …
取新序列的第乙個數3,它一定是素數,然後用3把序列的3的倍數篩掉:
5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, …
取新序列的第乙個數5,然後用5把序列的5的倍數篩掉:
7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, …
不斷篩下去,就可以得到所有的素數。
**實現如下:
""" 求1000000以內的素數 """
n =1000000
l1 =
[true
for i in
range
(n+1)]
#生成乙個全是true的的陣列
for i in
range(2
,n+1):
#2開始,遇到2的倍數(4,6,8,10...)都賦值為false
j=i+i #3開始,遇到3的倍數(6,9,12...)都賦值為false
while j#以此類推,把所有數字的倍數都賦值為false
l1[j]
=false
#輸出值是true的陣列下標
j = j + i
print
("素數:")t=
for i in
range(2
,n):
if l1[i]
==true
:print
(i,end=
" ")
以下還有幾種篩選法的不同寫法**,效果一樣
def
countprimes
(n):
""" 初始所有乙個n維陣列 res 表示數都為素數。
從3開始將3的奇數倍標記成false,即不是素數。
之後對每乙個素數此行上一步操作
這裡我們不用管偶數倍,因為我們最後判定時預設所有偶數不是素數
"""if n <3:
return[2
] res =
[true
]* n
for i in
range(3
,int
(n **
0.5)+1
,2):
res[i * i::2
* i]=[
false]*
((n - i * i -1)
//(2* i)+1
)return[2
]+[i for i in
range(3
, n,2)
if res[i]
]print
(countprimes(
1000000
))
i=
int(
input
('please enter an integer:'))
#建立乙個空list
r=list()
#新增元素22)
#從3開始挨個篩選
for a in
range(3
,i):
b=false
#用a除以小於a的質數b
for b in r:
if a % b ==0:
b =false
break
else
: b =
true
if b ==
true
:print
(r)
def
primes
(n):
if n <2:
return
if n ==2:
return[2
] s =
list
(range(3
, n,2)
) mroot = n **
0.5 half =
len(s)
i =0 m =
3while m <= mroot:
if s[i]
: j =
(m * m -3)
//2s[j]=0
while j < half:
s[j]=0
j += m
i = i +
1 m =
2* i +
3return[2
]+[x for x in s if x]
print
(primes(
1000000
))
謝謝點讚。 求素數的方法
如何求取素數呢?其實很簡單,思想呢就是找出所有整數p然後,刪去2 p,3 p。就好了?大該怎麼做呢?我們來真實資料 100以內有25個素數,10 3有168個,10 4有1229個,10 5有9592個,10 6有78498個,10 7有664579個 我們就有例項說明一下 0 n的所有素數 inc...
求素數,求因數的方法
素數的定義是 自己總結 只能被1和自身整除的數。注意 1.最小的素數是2。2.1 既不是素數也不是合數。3.素數不包括負數。一般的求解素數的方法是 include includeusing namespace std bool isprime int n int main void filterpr...
求素數 Python實現
用filter求素數 計算素數的乙個方法是埃氏篩法,它的演算法理解起來非常簡單 首先,列出從2開始的所有自然數,構造乙個序列 2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,取序列的第乙個數2,它一定是素數,然後用2把序列的2的倍數篩掉 3,4,5,...