素數打表法(四種方法)

2021-08-22 06:01:29 字數 1299 閱讀 2812

1.手動打表

當需要的資料範圍較小時,比如下面的40個

int prime[40]=;

//素數打表,因為n最大是20,所以只要打到40

2.按定義(耗時長)

最基本的方法是通過素數的定義直接判斷,只能被1和它本身整除的數就是素數了。這種方法適合判斷單個數是否為素數,當要求乙個範圍內素數而這個範圍又比較大時,這種方法就不太使用了,甚至程式要執行幾分鐘才能算出結果。

int i,n,x;

while(scanf("%d",&n)!=eof)

3.普通篩選法求素數

出現乙個數,則把已這個數為因子的數都標記為合數。

如2,所以4,6,8 10....都標記為合數

如3,所以9,12,15.....都標記為合數

如4,所以16,20,24...都標記為合數

即,若i是素數,則從 j=i*i 開始,把 j+i , j+2i , j+3i .....都標記為合數 (因為2*i , 3*i,4*i,....(i-1)*i 分別是2,3,4,...i-1的的倍數,已經在i之前標記過,所以從j=i*i開始標記)

篩法的思想是去除要求範圍內所有的合數,剩下的就是素數了,而任何合數都可以表示為素數的乘積,因此如果已知乙個數為素數,則它的倍數都為合數。

int main()

; int m=sqrt(n+0.5);

for(int i=2;i<=m;i++) if(!a[i])

for(int j=i+i;j<=n;j+=i) a[j]=1;

for(int i=2;i<=n;i++)

if(!a[i]) printf("%d ",i);

return 0;

}

版本二:

素數篩法是這樣的:

1.開乙個大的bool型陣列prime,大小就是n+1就可以了.先把所有的下標為奇數的標為true,下標為偶數的標為false.

2.然後:

for( i=3; i<=sqrt(n); i+=2 )

3.最後輸出bool陣列中的值為true的單元的下標,就是所求的n以內的素數了。

int prime[n];

int main()}}

int main()

素數打表的四種方法

題目 給出乙個正整數n,列印出所有從1 n的素數 即質數 1.傻瓜解法 複製 int i,n while scanf d n eof 複製 這是理所當然的想法,按照素數的定義,除了1和它本身沒有其他的因數,就是素數。這種解法的缺點就是紅色標註那裡,這種迴圈規模n稍微大點,執行時間就會特別特別長。2....

篩法素數打表方法

埃拉託斯特尼篩法,是一種西元前250年由古希臘數學家埃拉託斯特尼所提出的一種簡單檢定素數的演算法。給出要篩數值的範圍n,找出以內的素數。先用2去篩,即把2留下,把2的倍數剔除掉 再用下乙個質數,也就是3篩,把3留下,把3的倍數剔除掉 接下去用下乙個質數5篩,把5留下,把5的倍數剔除掉 不斷重複下去....

素數打表(三種篩選法)

第一種用得比較多 篩法1 eraosthenes 愛拉托斯尼篩法 篩法 for i 2 i 1000 i if s i 但是第一種如果是大於百萬級以上的話就 有點吃力了 因為其中有重複計算過的素數,這就不必要了!比如 10這個數,當2或者5的時候都被實行了一次s 10 1 所以為了減少不必要的,就有...