zoukankan      html  css  js  c++  java
  • C/C++筛选法算素数

    什么是求素数

    )i在2到n-1之间任取一个数,如果n能被整除则不是素数,否则就是素数

    普通枚举法:

    #include <iostream>
    #include <string>
    #include <cmath>
    #include <cstring>
    using namespace std;
    
    bool isPlain(int x){
        if(x<2) return false;
        else{
            for(int i=2;i<x;i++)
            {
                if(!(x%i))
                    return false;
            }
        }
        return true;
    }
    
    int main()
    {
        int n;
        cin>>n;
        int cot=0;
        for(int j=0;j<n;j++){
            if(isPlain(j)){
               cout<<j<<((++cot%7==0)?"
    ":"	");
            }
        }
    
    }
    
    

    筛选法:

    • 原始版本:
    #include <iostream>
    #include <string>
    #include <cmath>
    #include <cstring>
    using namespace std;
    
    
    int main()
    {
        int n;
        cin>>n;
        bool* ans=new bool[n];
        memset(ans,true,sizeof(bool)*n);//
        ans[0]=false;
        ans[1]=false;
        for(int i=2;i<n;i++){
            if(ans[i]){
                for(int j=i*2;j<n;j+=i){//倍数取整
                    ans[j]=false;
                }
            }
        }
        int col = 0;
        for(int i=0;i<n;i++){
            if(ans[i]){
                cout<<i<<" ";
            }
        }
        return 0;
    }
    
    
    • 改进版本
    #include <iostream>
    #include <string>
    #include <cmath>
    #include <cstring>
    #include <bitset>
    using namespace std;
    
    int main()
    {
        int n;
        cin>>n;
        bitset<100000> ans;
        ans.set(0);
        ans.set(1);
        for(int j=2; j<=sqrt(n); j++)
        {
            for(int i=2*j; i < n; i+=j)
            {
                ans.set(i);
            }
        }
        int cot=0;
        for(int i=0; i<n; i++)
        {
            if(ans[i]!=1)
            {
                cout<<i<<((++cot%7==0)?"
    ":"	");
            }
        }
    
    }
    
    

    例题

    question: 给定数字n,求出小于等于n的素数的个数,假设n<=1000000

    • 埃式筛选法(
    #include <bits/stdc++.h>
    
    /**
    @author:d g w
    */
    using namespace std;
    
    const int n=1000002;
    bool  isprime[1000002];
    int num[1000002];
    
    int main()
    {
        fill(isprime,isprime+n,1);
        fill(num,num+n,0);
        isprime[1]=0;
        num[1]=0;
        for(int i=2;i<n;i++){
    
            if(isprime[i]){
                num[i]=num[i-1]+1;
                for(int j=2*i;j<n;j+=i){
                    isprime[j]=0;
                }
            }else{
                num[i]=num[i-1];
            }
        }
        int n;
        while(~scanf("%d",&n)){
            cout<<num[n];
        }
        return 0;
    }
    
    
    
    
    • 欧拉筛选
    
    const int cont = 1000002;;  
    int Prime[cont];  
    bool vis[cont];  
    void prepare()  
    {  
        int num = 0;  
        memset(vis,true,sizeof(vis));  
        for(int i = 2; i <= cont; ++i)  
        {  
            if(vis[i])  
                Prime[++num] = i;  
            for(int j = 1; j <= num; ++j)  
            {  
                if (i * Prime[j] > cont)  
                    break;  
                vis[i * Prime[j]] = false;  
                if (i % Prime[j] == 0) //表明这个数已经被筛过了 
                    break;  
            }  
        }  
    }  
    
    
  • 相关阅读:
    php中字符与字节的区别
    sql把两值之和当作条件进行查询
    Intel® Neural Compute Stick 2
    使用OpenCV的VideoCapture 读取.mp4文件时出现以下错误:Unable to stop the stream: Inappropriate ioctl for device
    更换Raspbian Buster源
    OpenCV之cv2函数 2
    OpenCV中cv2的用法
    OpenVINO 对象识别 real_time_object_detection Movidius
    树莓派和计算棒实现图形识别 RaspBerry Pi4 with OpenVino and Movidius
    树莓派无线网卡老是掉线
  • 原文地址:https://www.cnblogs.com/dgwblog/p/8035784.html
Copyright © 2011-2022 走看看