筛选法求N范围内的所有素数

先把N个自然数按次序排列起来。1不是质数也不是合数,所以排除1,从2开始。2是质数留下来,把后面能被2整除的数全部删除;接着留下来的第二个素数是3,把后面能被3整除的数删除;依次后移,直到N。我用操作最简单的vector容器实现,看代码:


#include <iostream>
#include <vector>
using namespace std;
int main(){
	int n;
	cin>>n;
	if(n<=1){
		cout<<"error!"<<endl; //如果n<=1,则无意义,返回0;
		return 0;
	}
	vector<int>vec;
	for(int i = 2;i<=n;i++){
		vec.push_back(i);   //从2开始,依次放入容器
	}
	int i = 0;
	while(i<vec.size()){
		for(int j = i+1;j<vec.size();j++){
			if(vec[j] % vec[i] == 0){
				vec.erase(vec.begin()+j);   //如果能被整除,则直接删除掉
			}
		}
		i++;
	}

	for(int i=0;i<vec.size();i++){
		cout<<vec[i]<<' ';
	}
	return 0;
}



在C语言中,筛选法(也称为埃拉托斯特尼筛法)是一种寻找一定范围内质数的有效算法。下面是使用这种方法求解1到n之间素数个数的基本步骤: 1. 创建一个大小为n+1的布尔数组`isPrime[]`,并初始化所有元素为true,因为最初我们认为从0到n的所有数字都是可能的质数。 2. 遍历数组,从第一个非质数开始(通常认为2是最小的质数),即从索引i=2开始。对于每个找到的质数i,将`isPrime[i*2..n]`区间内的所有元素都设置为false,因为它们不可能是质数,因为它们能被i整除。 3. 统计过程中发现的“prime”值(即`isPrime[i]`为true的位置),这些位置对应的数值就是素数,记录下这个数量。 4. 当遍历结束时,`isPrime[2..n]`数组中剩下的true值就表示相应的数字是素数,统计true的数量即为1到n之间的素数个数。 下面是一个简单的C语言示例: ```c #include <stdio.h> int sieveOfEratosthenes(int n) { int isPrime[n + 1]; memset(isPrime, 1, sizeof(isPrime)); // 初始化为true for (int i = 2; i * i <= n; i++) { // 只需要检查到√n if (isPrime[i]) { for (int j = i * i; j <= n; j += i) { isPrime[j] = 0; // 将i的倍数标记为非质数 } } } int count = 0; for (int i = 2; i <= n; i++) { if (isPrime[i]) { count++; } } return count; } int main() { int n; printf("Enter a number n: "); scanf("%d", &n); int primeCount = sieveOfEratosthenes(n); printf("The number of primes between 1 and %d is: %d\n", n, primeCount); return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值