寻找素数我们最常用的方法是暴力求解法,就是没对于每个数n,从2找到n的开方,判断每个数是不是素数,时间复杂度度为O(nlog2n),时间复杂度高,是肯定的,因为太“暴力”,所以,我想换个思路,其实求素数的过程,就是去除合数的过程,如果对于一个散列,去除了合数,那么留下的就是素数了,时间复杂度接近O(n),代码如下:
#include <cstdio>
using namespace std;
void prime(unsigned int number, bool flag[]){
//初始化flag[i], true表示是素数
for (unsigned int i = 0; i < number; i++){
flag[i] = true;
}
//i从2判断到number的开方
for (unsigned int i = 2; i*i<=number; i++){
if (flag[i]){ //如果i是质数
//从它的最小倍数开始去除,直到number为止
for (unsigned int j = 2*i; j<=number; j++){
if (j%i == 0){
flag[j] = false;
}
}
}
}
}
void Print(int number, bool flag[]){
int count = 0;
for (unsigned int i = 2; i<number; i++){