原理是一個數字可以分解成 : 6n, 6n+1, 6n +2, 6n+3, 6n+4, 6n+5
其中6n、6n+2、6n+4可以被2整除,6n + 3可以被3整除,
因此只要處理6n+1、6n+5的數即可。
ps.對於更大的質數就要另外處理了。
- #include <iostream>
- using namespace std;
- const int MAX = 46341;
- void creat(bool* prime);
- void filter(bool*, int);
- int main()
- {
- bool prime[MAX + 1] = {}; //加{}確保每個元素都指向0
- creat(prime);
- int n1;
- while (cin >> n1){
- if(prime[n1])
- cout << "質數\n";
- else
- cout << "非質數\n";
- }
- }
- //創造質數表
- void creat(bool* prime)
- {
- prime[2] = prime[3] = prime[5] = 1;
- //把6n+1、6n+5全設為質數
- int i;
- for (i=1; 6*i+5 <= MAX; i++)
- {
- prime[6*i+5] = prime[6*i+1] = 1;
- }
- if (prime[6*i+1] <= MAX)
- {
- prime[6*i+1] = 1;
- }
- //然後過濾掉6n+1、6n+5的倍數皆不為質數
- int j;
- for (j=0; (6*j+5)*(6*j+5) <= MAX; j++)
- {
- filter(prime, 6*j+5);
- filter(prime, 6*j+1);
- }
- if (prime[6*j+1] <= MAX)
- {
- filter(prime, 6*j+1);
- }
- }
- //過濾掉質數的倍數
- void filter(bool* prime, int i)
- {
- if (prime[i])
- {
- for (int j=2; i*j <= MAX; j++)
- prime[i*j] = 0;
- }
- }
沒有留言:
張貼留言