蜗牛

一步一步往上爬

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

朴素筛法

不管是素数还是合数,都用来筛其后面的倍数

埃氏筛法

只使用素数的倍数可以把所有合数筛掉

线性筛法

用最小质因子就可以把所有合数筛掉

给定一个正整数 n,请你求出 1∼n 中质数的个数。

输入格式
共一行,包含整数 n。

输出格式
共一行,包含一个整数,表示 1∼n 中质数的个数。

数据范围
1≤n≤106
输入样例:
8
输出样例:
4

代码

#include<bits/stdc++.h>

using namespace std;

const int N = 1e6+10; 

int n;

int cnt;
int primes[N];

bool st[N];

int is_prime(int n)
{
	for( int i = 2; i <= n; i++ ){
//		if(!st[i])
//			primes[cnt++] = i;
//		朴素筛法	
//		for( int j = i+i; j <= n; j+=i )
//		    st[j] = true;
//		线性筛法 
//		for( int j = 0; primes[j] <= n/i; j++ ){
//			st[primes[j]*i] = true;
//			if(i%primes[j]==0)
//				break;
//		}
//		埃氏筛法 
		if(!st[i]){
			primes[cnt++] = i;
			for( int j = i+i; j <= n; j+=i )
				st[j] = true;
		}
	}
	
	return cnt;
}

int main()
{
	cin>>n;
	cout<<is_prime(n)<<endl;
	
	return 0;
}
posted on 2021-10-12 14:47  对影丶成三人  阅读(38)  评论(0)    收藏  举报