使用埃拉托色尼筛查找2至N内的质数

这段代码展示了如何使用筛法找到一定范围内的所有质数。首先创建一个布尔数组并初始化为true,然后从2开始,依次将每个质数的倍数标记为false。最后,遍历数组打印出所有仍为true的下标,即质数。通过这种方式,可以快速找出2到指定数之间的所有质数。此外,还提供了一个函数用于查找指定范围内的质数个数。
摘要由CSDN通过智能技术生成

筛选步骤:

(1)先把1删除(现今数学界1既不是质数也不是合数)

(2)读取队列中当前最小的数2,然后把2的倍数删去

(3)读取队列中当前最小的数3,然后把3的倍数删去

(4)读取队列中当前最小的数5,然后把5的倍数删去

(5)读取队列中当前最小的数7,然后把7的倍数删去

(6)如上所述直到需求的范围内所有的数均删除或读取

 输入上限N,查找2-N内的所有质数,代码如下:

#include <iostream>
using std::cout;
using std::cin;
using std::endl;

void process_prime(bool *p, int max_n, int n);
int main(void) {
	int max_n = 0;
	int count = 0;//质数的个数
	cout << "Cauculator primes up to what number? ";
	cin >> max_n;
	//分配内存
	bool *p = new bool[max_n + 1];
	//初始化
	for (int i = 2; i <= max_n; i++) {
		p[i] = true;
	}
	//查找质数
	for (int i = 2; i <= max_n; i++) {
		if (p[i]) {
			count++;
			process_prime(p, max_n, i);
		}
	}
	cout << endl;
	cout << "The number of between 2 to " << max_n << " prime is :" << count << endl;
	
	//释放内存
	delete[]p;
	return 0;
}

/*
	处理质数函数,打印传递给函数的n,然后把数组p中所有关于n的倍数的元素标记为false
*/
void process_prime(bool *p, int max_n, int n) {
	cout << n << "\t";
	for (int i = n+n; i <= max_n; i += n) {
		p[i] = false;
	}
}

代码原理:

首先创建一个N+1大小的bool类型的数组,为其分配内存,并且将其所有元素初始化为true;

然后从下标2开始,将下标为2的倍数的元素全设为false;

然后是下标3,。。。

如果元素为true,说明其为质数,将其下标打印,并计数。

进阶:查找N至M之间的质数

思路:先查找2至M之间的质数,将大于N的质数输出即可。

#include <iostream>
using std::cout;
using std::cin;
using std::endl;

//查找lower至upper之间的所有质数,返回质数的个数,包括lower和upper
int get_prime(int upper, int lower);
int main(void) {
	int upper = 0,lower = 0;
	
	cout << "Cauculator primes up to what number? "<<endl;
	cout << "enter upper:";
	cin >> upper;
	cout << "enter lower:";
	cin >> lower;
	int count = get_prime(upper, lower);
	cout << "The number of between " << lower << " to " << upper << " prime is :" << count << endl;
	return 0;
}

int get_prime(int upper, int lower) {

	if (upper < 2 ) return 0;
	int count = 0;//质数的个数
	//分配内存
	bool *p = new bool[upper + 1];

	//初始化
	for (int i = 2; i <= upper; i++) {
		p[i] = true;
	}
	//筛选
	for (int i = 2; i <= upper; i++) {
		if (p[i]) {
			for (int j = i * 2; j <= upper; j += i) {
				p[j] = false;
			}
		}
	}
	//查找质数
	for (int i = lower; i <= upper; i++) {
		if (p[i]){
			count++;
			cout << i << "\t";
		}
	}
	cout << endl;

	//释放内存
	delete[]p;
	return count;
}

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SOC罗三炮

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值