C++数学-数论质数的判定试除法流食般投喂

算法的学习不论难易,都需要手动模拟算法流程呦~


质数的判定:

先简单介绍一下质数和合数的概念:

一个大于 1 的自然数,除了 1 和它本身外,不能被其他自然数整除的数叫做质数;否则就称为合数。

其中质数又称为素数。

规定 1 既不是质数也不是合数。
质数的判定算法原理:

试除法判断质数:

对于一个数 x ,根据定义,可以从 2,x - 1 一个一个尝试,判断 x 是否能被整除。但是,没有必要每一个都去判断,因为 a 如果是 x 的约数,那么 x / a 也是 x 的约数。因此,我们仅需判断较小的 a 是不是 x 的约数, 没有必要再去看看 x / a。那么,仅需枚举到 "根号x" 即可。
算法时间复杂度:

试除法枚举到 "根号n" ,因此时间复杂度为 O(根号N) 。


OJ题来源:洛谷

OJ题名:【深基7.例2】质数筛

OJ题归属:数学-数论【质数的判定】

解题算法:试除法

💡经验总结:由于枚举到 "根号n",for 循环的条件判断出应为 "i <= 根号x",但是可以写成 "i <= x / i",这种写法可以防溢出。

|---------------------|
| i <= 根号x |
| 同平方: i^2 <= x |
| 同除以 i : i <= x / i |

cpp 复制代码
#include<iostream>

using namespace std;

bool prime(int x)
{
	if (x <= 1) return false;

	for (int i = 2; i <= x / i; i++) // i <= 根号x   i^2 <= x   i <= x / i   防溢出
	{
		if (x % i == 0) return false;
	}

	return true;
}

int main()
{
	int n; cin >> n;
	for (int i = 1; i <= n; i++)
	{
		int x; cin >> x;
		if (prime(x)) cout << x << " ";
	}

	return 0;
}