又见素数

Description
给定一个正整数n(n <= 10000000),求n(包含)以内素数的个数。
Input
第一行为一个整数t(t <= 1000),表示测试数据的组数。接下来有t行,每行一个整数n。
Output
对于每个n,求n以内素数的个数。
Sample Input
 2
 5

10

思路:

考虑到内存大小先声明一个char类型的大数组a[maxn]然后全面置0

再另外声明一个int 类型的大数组b[maxn]也置0

利用for循环先将奇数置为1;

然后筛选不是素数的奇数将其置为0;(素数的倍数不是素数)

 

代码如下:

#include<iostream>
using namespace std;
#define N 10000005
char isprime[N + 1] = { 0 };
int Num[N + 1] = { 0 };
int main()
{
      isprime[2] = 1;//2为素数
      for (int i = 3; i<= N; i+= 2)//筛选奇数
      {
            isprime[i] = 1;
      }
      for (int i = 3; i*i < N; i += 2)//素数的倍数不是素数
      {
            if (isprime[i])
            {
                 for (int j = i*i; j<=N; j += 2 * i)
                 {
                       isprime[j] = 0;
                 }
            }
      }
 Num[2]= 1;
      for (int i = 3; i <= N; i++)
      {
            Num[i] = Num[i - 1];
            if (isprime[i])Num[i]++;//遇到素数个数+1 
      }
      int n, t;
      cin >> t;
 
      while (t--)
      {
            int p = 1;
            cin >> n;
            cout << Num[n]<< endl;
      }
     return0;
}


 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值