1. 程式人生 > 其它 >161-用厄拉多塞篩法求質數個數

161-用厄拉多塞篩法求質數個數

技術標籤:林澤宇刷題演算法

厄拉多塞篩法

西元前250年,希臘數學家厄拉多塞想到了一個非常美妙的質數篩法,減少了逐一檢查每個數的的步驟,可以比較簡單的從一大堆數字之中,篩選出質數來,這方法被稱作厄拉多塞篩法(Sieve of Eeatosthese)。

具體操作:先將 2~n 的各個數放入表中,然後在2的上面畫一個圓圈,然後劃去2的其他倍數;第一個既未畫圈又沒有被劃去的數是3,將它畫圈,再劃去3的其他倍數;現在既未畫圈又沒有被劃去的第一個數 是5,將它畫圈,並劃去5的其他倍數……依次類推,一直到所有小於或等於 n 的各數都畫了圈或劃去為止。這時,表中畫了圈的以及未劃去的那些數正好就是小於 n 的素數。

#include<iostream>
#include<vector>
using namespace std;
int countPrimes(int n)
{
    vector<int> flag(n, true);//開闢n個空間,均初始化為true
    int count = 0;//定義計數器,初始化為0
    for (int i = 2; i * i < n; ++i)//1不是質數,從2開始判斷
    {
        if (flag[i])//為true,進入if語句,即為質數,進入if語句
        {
            for
(int j = i * i; j < n; j += i) //把i*i及可以整除i*i的數置為false,即不是質數 { flag[j] = false; } } } for (int i = 2; i < n; ++i)//此時是true的就是質數了 { if (flag[i])//是質數 count++; } return count; } int main() { cout<<
countPrimes(10)<<endl; return 0; }

執行截圖如下:
在這裡插入圖片描述
備註:
1不是質數。質數又稱素數。一個大於1的自然數,除了1和它自身外,不能整除其他自然數的數叫做質數;否則稱為合數。質數的定義中明確指出了一個前提條件,一個大於1的自然數。1不屬於這個範圍,所以1不是質數。