Linear screening

Linear screening

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;
}




Guess you like

Origin blog.csdn.net/weixin_48180029/article/details/114107944