Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

โปรแกรม C++ การถาลล้อ (Wheel Sieve) สร้างจำนวนเฉพาะในช่วงที่กำหนด


การถาลล้อ (Wheel Sieve)

วิธีการถาลล้อใช้หาจำนวนเฉพาะในช่วงที่กำหนด การแยกตัวประกอบล้อ (Wheel factorization) เป็นวิธีทางกราฟิกสำหรับการทำขั้นตอนเตรียมการแบบมืออาชีพสำหรับการถาลเอราโทสเตนีส ที่แยกจำนวนเฉพาะออกจากตัวเลขประกอบ (composites)

ในวิธีนี้ จำนวนเฉพาะในวงในสุดจะมีพหุคูณในตำแหน่งที่คล้ายกันเหมือนตัวมันเองในวงอื่นๆ ทำให้เกิดเส้นลวดล้อ (spokes) ของจำนวนเฉพาะและพหุคูณของมัน พหุคูณของจำนวนเฉพาะเหล่านี้ในวงในสุดจะสร้างเส้นลวดล้อของตัวเลขประกอบในวงนอก

อัลกอริทึม

เริ่มต้น
  กำหนดหมายเลขสูงสุด (max number)
  gen_sieve_primes()
  ประกาศ c
  กำหนด c = 2
  For p = 2 ถึง max number
    If prime[p] == 0
      prime[p] = 1
      Mul = p คูณ c
      For Mul น้อยกว่า max number
        prime[Mul] = -1
        เพิ่ม c
        Mul = p คูณ c
  Print_all_prime()
  กำหนด c = 0
  For i = 0 ถึง max number
    if (prime[i] == 1)
      เพิ่ม c
      If c น้อยกว่า 4
        Switch(c)
        Case 1: พิมพ์จำนวนเฉพาะลำดับที่ 1
        Case 2: พิมพ์จำนวนเฉพาะลำดับที่ 2
        Case 3: พิมพ์จำนวนเฉพาะลำดับที่ 3
      Else
        พิมพ์จำนวนเฉพาะลำดับที่ n
สิ้นสุด

โค้ดตัวอย่าง

#include <iostream>
using namespace std;
#define MAX_NUMBER 40
int prime[MAX_NUMBER];

void gen_sieve_prime(void) {
    for (int p = 2; p < MAX_NUMBER; p++) {
        if (prime[p] == 0)
            prime[p] = 1;
        int c = 2;
        int mul = p * c;
        for (; mul < MAX_NUMBER;) {
            prime[mul] = -1;
            c++;
            mul = p * c;
        }
    }
}

void print_all_prime() {
    int c = 0;
    for (int i = 0; i < MAX_NUMBER; i++) {
        if (prime[i] == 1) {
            c++;
            if (c < 4) {
                switch (c) {
                    case 1:
                        cout << c << "st prime is: " << i << endl;
                        break;
                    case 2:
                        cout << c << "nd prime is: " << i << endl;
                        break;
                    case 3:
                        cout << c << "rd prime is: " << i << endl;
                        break;
                    default:
                        break;
                }
            } else
                cout << c << "th prime is: " << i << endl;
        }
    }
}

int main() {
    gen_sieve_prime();
    print_all_prime();
    return 0;
}

ผลลัพธ์ตัวอย่าง

1st prime is: 2
2nd prime is: 3
3rd prime is: 5
4th prime is: 7
5th prime is: 11
6th prime is: 13
7th prime is: 17
8th prime is: 19
9th prime is: 23
10th prime is: 29
11th prime is: 31
12th prime is: 37