埃氏篩法思想解題

何爲“埃氏篩法”

埃拉託斯特尼篩法,簡稱埃氏篩或愛氏篩,是一種由希臘數學家埃拉託斯特尼所提出的一種簡單檢定素數的算法。要得到自然數n以內的全部素數,必須把不大於根號n的所有素數的倍數剔除,剩下的就是素數。

求n以內的素數個數

給你一個數n,請問n以內有多少個素數?一般來說,要是對一個整數進行素數判斷,首先想到的是寫個函數判斷是否爲素數,然後調用這個函數,時間複雜度爲O(n^(½),但是要求n以內的素數就略顯吃力了。這裏就可以用埃氏篩法來處理這個問題。

#include <iostream>
#include <cstdio>
using namespace std;
const int SIZE = 1e7;

int prime[SIZE];        //第i個素數
bool is_prime[SIZE];    //true表示i是素數

int slove(int n){
    int p=0;
    for(int i=0; i<=n; i++)
        is_prime[i] = true;     //初始化
    is_prime[0] = is_prime[1] = false;  //0,1不是素數
    for(int i=2; i<=n; i++){
        if(is_prime[i]){
            prime[p++] = i;
            for(int j=2*i; j<=n; j+=i)  //將i的倍數全部設爲false
                is_prime[j] = false;
        }
    }
    return p;
}

int main(){
    int n;
    while(cin>>n){
        int res = slove(n);
        cout<<res<<endl;
        for(int i=0; i<res; i++)
            cout<<prime[i]<<endl;
    }
}

看代碼說明,埃氏篩法是通過把不大於n的所有素數的倍數剔除,剩下的就是素數,這裏最小的素數是2,將表中所有2的倍數都除去,剩下最小的數是3,不能被更小的數整除,所以是素數。再將表中3的倍數的數除去。以此類推。如果表中最小的數字是m,m就是素數。然後將表中所有m的倍數都除去……

利用埃氏篩法的思想解題

鏈接:https://www.nowcoder.com/acm/contest/71/A
來源:牛客網

找一找
時間限制:C/C++ 1秒,其他語言2秒
空間限制:C/C++ 262144K,其他語言524288K
64bit IO Format: %lld
題目描述
給定n個正整數,請找出其中有多少個數x滿足:在這n個數中存在數y=kx,其中k爲大於1的整數
輸入描述:
第一行輸入一個n
接下來一行輸入n個正整數ai
輸出描述:
輸出符合條件個數
示例1
輸入
5
1 2 3 4 5
輸出
2
說明
5個數中1和2符合條件,1是後面每個數的因子,2是4的因子
備註:
1≤n,a
i
≤1000000

#include <cstdio>
#include <iostream>
#include <cstring>
#include <string>
typedef long long ll;
typedef unsigned long long ull;
using namespace std;

const int N=1e6+5;
int b[N],a[N],sum;
int main()
{
    int n;
    cin>>n;
    for(int i=0; i<n; i++)
        cin>>a[i],b[a[i]]=1;
    for(int i=0; i<n; i++)
    {
        if(a[i]==1)
        {
            sum++;
            continue;
        }
        for(int j=a[i]+a[i]; j<N; j+=a[i])
            if(b[j]==1)
            {
                sum++;
                break;
            }
    }
    printf("%d\n",sum);
    system("pause");
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章