zoukankan      html  css  js  c++  java
  • 统计素数个数

    【题目描述】

    询问[a,b]中素数的个数。

    【输入描述】

    输入两个整数a、b(a,b ≤ 5000000)。

    【输出描述】

    输出一个数,表示答案。

    【样例输入】

    3 5

    【样例输出】

    2

    源代码:
    
    #include<cstdio>
    int Left,Right,Ans(0),Num(0),Prime[350000];
    bool Flag[5000001]={0};
    void Euler()
    {
        for (int a=2;a<=Right;a++)
        {
            if (!Flag[a])
            {
                if (a>=Left)
                  Ans++;
                Prime[++Num]=a;
            }
            for (int b=1;b<=Num&&a*Prime[b]<=Right;b++) //其实想想,此时Prime[b]必为a*Prime[b]的最小素因子。
            {
                Flag[a*Prime[b]]=true;
                if (!(a%Prime[b])) //关键语句,此时Prime[b]即为a的最小素因子,往后的运算就是冗余的了。
                  break;
            }
        }
    }
    int main() //欧拉筛法。
    {
        scanf("%d%d",&Left,&Right);
        Euler();
        printf("%d",Ans);
        return 0;
    }
    
    /*
        欧拉筛法线性时间求素数。
        可知,每个合数都可以表示为一系列素数的积。
        则每个合数必对应一个最小素因子。
        若能凭此筛去,则时间复杂度为O(n)。
    */
  • 相关阅读:
    (C/C++)区别:数组与指针,指针与引用
    C++中数组名和指针的区别联系
    C++引用的用处
    C++编写DLL动态链接库的步骤与实现方法
    C++_编写动态链接库
    C++ 模板
    C++ 信号处理
    C++ 多线程
    js事件冒泡
    js事件委托
  • 原文地址:https://www.cnblogs.com/Ackermann/p/5952818.html
Copyright © 2011-2022 走看看