筛选法求素数(C++和Python代码)
筛选法,又称埃拉托斯特尼筛选法(Sieve of Eratosthenes),是一种用于求解素数的简单而高效的算法。
筛选法求素数,从2开始,遍历到sqrt(n)为止(sqrt表示平方根)。为何遍历到sqrt(n)为止就可以了?
在筛选法求素数时,我们需要判断一个数是否为素数。假设我们要判断一个数n是否为素数,如果存在一个大于1且小于n的因子,那么必然存在两个因子a和b,其中a<=sqrt(n),b>=sqrt(n)。如果a和b都大于sqrt(n),那么它们的乘积ab就大于n,与假设矛盾。因此,如果在遍历到sqrt(n)之前没有找到任何小于等于sqrt(n)的因子,那么n就是素数。
举个例子,假设我们要判断一个数25是否为素数。如果我们从2开始遍历到25,我们可以发现2、3、4、5都不能整除25,但是当我们遍历到5时,我们就可以停止了,因为5的平方根是5,再大于5的数就没有必要再判断了。因为如果25有一个大于5的因子,那么它必然有一个小于等于5的因子,我们在遍历到5之前就应该找到了。
因此,遍历到sqrt(n)为止就可以了,这样可以减少不必要的计算量,提高算法的效率。
以下是求解100以内素数的C++和Python代码。
C++代码:
#include <iostream>
#include <cmath>
using namespace std;
bool isPrime(int num) {
if (num <= 1) {
return false;
}
for (int i = 2; i <= sqrt(num); i++) {
if (num % i == 0) {
return false;
}
}
return true;
}
int main() {
for (int i = 2; i <= 100; i++) {
if (isPrime(i)) {
cout << i << " ";
}
}
cout << endl;
return 0;
}
Python代码:
import math
def is_prime(num):
if num <= 1:
return False
for i in range(2, int(math.sqrt(num)) + 1):
if num % i == 0:
return False
return True
for i in range(2, 101):
if is_prime(i):
print(i, end=" ")
print()