• 区间内的素数个数判定


    问题一:

    给定整数n,求n以内有多少个素数

    分析:
    应用筛选法,其核心思想就是,首先将2~n范围内的所有整数写出来。其中最小的数字2是素数,将表中所有2的倍数都划去。表中剩余的最小的数字是3,它不能被更小的整数除,所以它是素数,再将表中所有的3得倍数都划去。以此类推,如果表中剩余的数字是m的话,m就是素数,然后再将所有的m的倍数划去。

    #include<iostream>
    #include<stdio.h>
    using namespace std;
    int prime[1000009];///保存素数
    bool is_prime[1000009];///表示i是不是素数
    
    int sieve(int n)
    {
        int ans=0;
        for(int i=0;i<=n;i++)
            is_prime[i]=true;
        is_prime[0]=is_prime[1]=false;
        for(int i=2;i<=n;i++)
        {
            if(is_prime[i])
            {
                prime[ans++]=i;
                for(int j=2*i;j<=n;j+=i)
                    is_prime[j]=false;
            }
        }
        return ans;
    }
    int main()
    {
        int n;
        scanf("%d",&n);
        printf("%d
    ",sieve(n));
        return 0;
    }
    

    问题二:

    求一个特定的区间 (a<=x<b) 内的素数的个数

    #include<iostream>
    #include<stdio.h>
    typedef long long ll;
    using namespace std;
    bool is_prime_small[1000009];
    bool is_prime[1000009];
    ///对区间[a,b)内的整数进行筛选。 is_prime[i-a]=true <=> i是素数
    
    void segment_sieve(ll a,ll b)
    {
        for(int i=0;(ll)i*i<b;i++)
            is_prime_small[i]=true;
        for(int i=0;i<b-a;i++)
            is_prime[i]=true;
        for(int i=2;(ll)i*i<b;i++)
            if(is_prime_small[i])
            {
                for(int j=2*i;(ll)j*j<b;j+=i)
                    is_prime_small[j]=false;
                for(ll j=max(2LL,(a+i-1)/i)*i;j<b;j+=i)
                    is_prime[j-a]=false;
            }
    }
    int main()
    {
        ll a,b,c;
        scanf("%lld%lld",&a,&b);
        segment_sieve( a, b);
        int ans=0;
        c=b-a;
        for(int i=0;i<c;i++)
        {
            if(is_prime[i]) ans++;//cout<<i+a<<" ";
        }
        if(a==1) ans--;
        printf("%d",ans);
        return 0;
    }
    
  • 相关阅读:
    docker镜像管理基础
    docker的基础应用
    mysql基础
    策略模式
    简单工厂模式
    hystrix-go简介
    手把手带你使用 go-kit(option)
    手把手带你使用 go-kit(组件扩充,服务发现)
    手把手带你使用 go-kit(客户端直连)
    手把手带你使用 go-kit(基础篇)
  • 原文地址:https://www.cnblogs.com/cmmdc/p/7202704.html
Copyright © 2020-2023  润新知