

算法的学习不论难易,都需要手动模拟算法流程呦~
质数的判定:
先简单介绍一下质数和合数的概念:
一个大于 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; }