质数数量 牛客22226题

链接:https://ac.nowcoder.com/acm/problem/22226
来源:牛客网

质数数量

题目描述

质数(prime number)又称素数,有无限个,质数定义为在大于1的自然数中,除了1和它本身以外不再有其他因数。

例如小于10的质数有2,3,5,7。

输入描述:

第一行输入一个整数T,表示询问的个数

接下来T行每行输入一个整数n.

1<=T<=1e8,1<=n<=1000000

输出描述:

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

示例1

输入

2
10
1000000

输出

4
78498
分析:

本题打表会节省时间

声明一个数组a[1000001], 第i个元素a[i] 存放的值为≤i的所有素数的个数

首先可知:a[0]=a[1] =0; //0,1 都不是素数 个数为0

a[2]=1; //<=2的素数只有2一个 ,

从3往后开始遍历,如果a[i]为素数,那么a[i] = 前一个数之前的素数的个数+1 (a[i]本身)

for i int range(2,1000001): #从2到1000000
	if(isPrime(i)): #如果i为素数
        a[i] = a[i-1]+1
     else:
        a[i] = a[i-1]
主要问题解决了,那么下一步,要判断 i 是否为素数

有两种方法:

  1. 循环判断
int isPrime(int num)
{
     
	if(num<2) return 0; //≤1的不是质数 
	for(int i=2;i*i<=num;++i)
		if(num%i==0) return 0;
	return 1;
}
  1. 打表判素数
int prime[1000001]={
     0}; 
for(int i=2;i<=1000;++i)
{
     
    if(prime[i] == 0) //如果这个数是素数
    {
     
        for(int j=i*i;j<=1000000;j+=i) //那么从i的平方开始,每次加上i 这个数为合数(非素数)
            prime[j] =1;
    }
}

//若prime[i] == 0 则这个数为素数 (i>=2)
//否则 为合数 (i>=2)
AC代码1:
#include 
#include 
#include 
int a[1000005]={
     0,0,1};
int isPrime(int num)
{
     
//	if(num<2) return 0; //≤1的不是质数 
	for(int i=2;i*i<=num;++i)
		if(num%i==0) return 0;
	return 1;
}
int main()
{
     
	for(int i=3;i<=1000001;++i)
	{
     
		if(isPrime(i)) a[i] = a[i-1]+1;
		else a[i] = a[i-1];
	}
	int T;
	scanf("%d",&T);
	int n; 
	while(T--)
	{
     
		scanf("%d",&n);
		printf("%d\n",a[n]);
	} 
	return 0;
}
AC代码2:
#include 
#include 
#include 
int a[1000005]={
     0,0,1};
int prime[1000005]={
     0};
int main()
{
     
	for(int i=2;i<=1000;++i)
	{
     
		if(prime[i] == 0) //如果这个数是素数
			for(int j=i*i;j<=1000000;j+=i) //那么从i的平方开始,每次加上i 这个数为合数(非素数)
				prime[j] =1;
	}
	
	for(int i=3;i<=1000001;++i)
	{
     
		if(prime[i]==0) a[i] = a[i-1] + 1;  //为素数 
		else a[i] = a[i-1];
	}
	int T;
	scanf("%d",&T);
	int n; 
	while(T--)
	{
     
		scanf("%d",&n);
		printf("%d\n",a[n]);
	} 
	return 0;
}

你可能感兴趣的:(笔记,acm竞赛,c++,c语言,算法)