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;  
            }  
        }  
    }  
    
    
  • 相关阅读:
    SourceTree 启动不需要账号
    获取httpservletrequest所有参数的键值对--key-value,用getParameterMap
    ajax 参数出现在Request payload导致request.getParameter(name)是获取不到值
    导出
    替换jar包里面的文件。利用jar ucf
    mysql CPU使用率过高的一次处理经历
    实用小知识
    spring-boot 静态资源自定义配置
    java多线程调用静态方法安全吗?
    spring 注解@Bean
  • 原文地址:https://www.cnblogs.com/dgwblog/p/8035784.html
Copyright © 2011-2022 走看看