算法学习笔记三 质数

这篇博客介绍了如何判断一个数是否为质数,通过遍历到数的平方根来优化算法。同时,详细讲解了埃筛法,这是一种高效找出一定范围内所有质数的方法,通过标记非质数的倍数来筛选出质数。代码示例展示了如何实现这两个算法。
摘要由CSDN通过智能技术生成

算法学习笔记三 质数

一、判断是否为质数

基本原理:质数,即不被除了1和本身的所有数整除,于是从2开始进行遍历,很显然只要遍历到自身的根号,如果还没有找到一个可以被整除的数,那说明就是质数了;只要找到一个就说明不是质数。

bool isprime(int a)
{
	for (int i = 2; i < sqrt(a); i++)
	{
		if (a % i == 0)
			return false;
	}
	return true;
}

二、埃筛求素数

埃筛是一种求解素数相关题目的常见做法,作用是做好max以下的所有数据的是否为质数的标记。

基本原理:首先确定2、3是素数中最小的两个,然后开始遍历2的所有倍数,只要是2的倍数,就标记为不是素数;然后标记3的所有倍数…;然后注意到4已经标记为不是素数了所以跳过;然后标记5的所有倍数…多轮标记下来就可以得到max以下所有数据的标记了。

如果要输出,刚好数组的下标就是该数字,输出下标即可。

#include <iostream>
using namespace std;

int main() {
	const int max = 10000;
	int prime[max];
	for (int i = 0; i < max; i++) prime[i] = 1;   //1表示为素数
	prime[0] = prime[1] = 0;   //特殊处理,排除0和1

	for (int i = 2; i < max; i++)
	{
		if (!prime[i])  //如果标记为0,即不是素数,就跳过这一个数字
			continue;
		else   //如果标记为1,那么这个是素数,其倍数也就不是素数
		{
			for (int j = i * 2; j < max; j = j + i)
				prime[j] = 0;
		}
	}  //得到10000以内的所有素数
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值