线性筛选法
for(int i=2;i<n;i++)遍历
当 i = 2时,素数数组prime = [2]
遍历素数数组,for(int j:prime)
当 j = 2时,筛选出合数2 * 2 = 4
当 i = 3时,素数数组prime = [2,3]
遍历素数数组,for(int j:prime)
当 j = 2时,筛选出合数2 * 3 = 6
当 j = 3时,筛选出合数3 * 3 = 9
当 i = 4时,素数数组prime = [2,3]
遍历素数数组,for(int j:prime)
当 j = 2时,筛选出合数2 * 4 = 8
判断4 % 2 == 0,则4是合数,终止遍历素数数组
当 i = 5时,素数数组prime = [2,3,5]
遍历素数数组,for(int j:prime)
当 j = 2时,筛选出合数2 * 5 = 10
当 j = 3时,筛选出合数3 * 5 = 15
当 j = 5时,筛选出合数5 * 5 = 25
当 i = 6时,素数数组prime = [2,3,5]
遍历素数数组,for(int j:prime)
当 j = 2时,筛选出合数2 * 6 = 12
判断6 % 2 == 0,则6是合数,终止遍历素数数组
当 i = 7时,素数数组prime = [2,3,5,7]
遍历素数数组,for(int j:prime)
当 j = 2时,筛选出合数2 * 7 = 14
当 j = 3时,筛选出合数3 * 7 = 21
当 j = 5时,筛选出合数5 * 7 = 35
当 j = 7时,筛选出合数7 * 7 = 49
当 i = 8时,素数数组prime = [2,3,5,7]
遍历素数数组,for(int j:prime)
当 j = 2时,筛选出合数2 * 8 = 16
判断8 % 2 == 0,则8是合数,终止遍历素数数组
当 i = 9时,素数数组prime = [2,3,5,7]
遍历素数数组,for(int j:prime)
当 j = 2时,筛选出合数2 * 9 = 18
当 j = 3时,筛选出合数3 * 9 = 27
判断9 % 3 == 0,则9是合数,终止遍历素数数组
当 i = 10时,素数数组prime = [2,3,5,7]
遍历素数数组,for(int j:prime)
当 j = 2时,筛选出合数2 * 10 = 20
判断10 % 2 == 0,则10是合数,终止遍历素数数组
当 i = 11时,素数数组prime = [2,3,5,7,11]
遍历素数数组,for(int j:prime)
当 j = 2时,筛选出合数2 * 11 = 22
当 j = 3时,筛选出合数3 * 11 = 33
当 j = 5时,筛选出合数5 * 11 = 55
当 j = 7时,筛选出合数7 * 11 = 77
当 i = 12时,素数数组prime = [2,3,5,7,11]
遍历素数数组,for(int j:prime)
当 j = 2时,筛选出合数2 * 12 = 24
判断12 % 2 == 0,则12是合数,终止遍历素数数组
当 i = 13时,素数数组prime = [2,3,5,7,11,13]
遍历素数数组,for(int j:prime)
当 j = 2时,筛选出合数2 * 13 = 26
当 j = 3时,筛选出合数3 * 13 = 39
当 j = 5时,筛选出合数5 * 13 = 65
当 j = 7时,筛选出合数7 * 13 = 91
当 i = 14时,素数数组prime = [2,3,5,7,11,13]
遍历素数数组,for(int j:prime)
当 j = 2时,筛选出合数2 * 14 = 28
判断14 % 2 == 0,则14是合数,终止遍历素数数组
当 i = 15时,素数数组prime = [2,3,5,7,11,13]
遍历素数数组,for(int j:prime)
当 j = 2时,筛选出合数2 * 15 = 30
当 j = 3时,筛选出合数3 * 15 = 45
判断15 % 3 == 0,则15是合数,终止遍历素数数组
当 i = 16时,素数数组prime = [2,3,5,7,11,13]
遍历素数数组,for(int j:prime)
当 j = 2时,筛选出合数2 * 16 = 32
判断16 % 2 == 0,则16是合数,终止遍历素数数组
当 i = 17时,素数数组prime = [2,3,5,7,11,13,17]
遍历素数数组,for(int j:prime)
当 j = 2时,筛选出合数2 * 17 = 34
当 j = 3时,筛选出合数3 * 17 = 51
当 j = 5时,筛选出合数5 * 17 = 85
当 i = 18时,素数数组prime = [2,3,5,7,11,13,17]
遍历素数数组,for(int j:prime)
当 j = 2时,筛选出合数2 * 18 = 36
判断18 % 2 == 0,则18是合数,终止遍历素数数组
当 i = 19时,素数数组prime = [2,3,5,7,11,13,17,19]
遍历素数数组,for(int j:prime)
当 j = 2时,筛选出合数2 * 19 = 38
当 j = 3时,筛选出合数3 * 19 = 57
当 j = 5时,筛选出合数5 * 19 = 95
当 i = 20时,素数数组prime = [2,3,5,7,11,13,17,19]
遍历素数数组,for(int j:prime)
当 j = 2时,筛选出合数2 * 20 = 40
判断20 % 2 == 0,则20是合数,终止遍历素数数组
当 i = 21时,素数数组prime = [2,3,5,7,11,13,17,19]
遍历素数数组,for(int j:prime)
当 j = 2时,筛选出合数2 * 21 = 42
当 j = 3时,筛选出合数3 * 21 = 63
判断21 % 3 == 0,则21是合数,终止遍历素数数组
...........
...........
...........
#include<iostream>
using namespace std;
vector<int> prime;
bool* no_prime;
void get_all_prime(int n) {
no_prime = new bool[n + 1]{false};
for (int i = 2;i <= n;i++) {
cout << "当 i = " << i << "时,";
if (!no_prime[i]) {
prime.push_back(i);
}
cout << "素数数组prime = [";
int k=0;
for (;k < prime.size()-1;k++) {
cout << prime[k] << ",";
}
cout << prime[k] << "]\n";
cout << "\t遍历素数数组,for(int j:prime)\n";
for (int j = 0;j < prime.size() && prime[j] * i <= n;j++) {
cout << "\t\t当 j = " << prime[j] << "时,"
<< "筛选出合数" << prime[j] << " * " << i
<< " = " << prime[j] * i << "\n";
no_prime[prime[j] * i] = true;
if (i % prime[j] == 0) {
if (i != prime[j]) {
cout << "\t\t判断" << i << " % " << prime[j] << " == 0"
<< ",则" << i << "是合数,终止遍历素数数组\n";
}
break;
}
}
cout << "\n";
}
}
int main() {
get_all_prime(100);
return 0;
}