数组-筛法求素数

题目描述:

筛法求素数,指的是每次将一个素数的所有的倍数去掉,如果当前的数没有被比它小的数去掉过,那么当前的数就是素数。

比如1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20

1不是素数。不用管。

2是素数,那么2的所有的倍数要被去掉。

3是素数,那么3的所有的倍数要被去掉。

4 被去掉了。不用管。

。。。

这样做下去我们就可以筛选出所有的指定范围内的素数了。

你的任务是求小于等于n的素数的个数count。

输出格式:

对于每个询问n输出小于等于n的的素数的个数。

样例输入:

2
10
1000000

样例输出:

4
78498

 解析代码:

使用两个数组,一个用来存放质数,一个用来存放素数的个数

#include<iostream>
using namespace std;
//T个询问,每次询问一个整数N,每次输出前N个数中素数的个数。T<=1亿 N<=1000000
int c[1000001];  //刚开始,所有数都标记为质数
int a[1000001];  //表示前N个数总共有多少个素数
 
int m=0;
int main()
{
 //
    for(int i=2;i<=1000000;i++)
      {
        if(c[i]==0)  //if(!a[i])
            for(int j=2*i;j<=1000000;j=j+i)
                 c[j]=1;
       }
      for(int i=2;i<=1000000;i++)
      {
        if(c[i]==0) 
            m++;
        a[i]=m;
      }
    int T;
    cin>>T;
    int n;
     for(int i=1;i<=T;i++)
     {
        cin>>n;
        cout<<a[n]<<"\n";
     }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_40539125/article/details/83894015