2013年12月24日 星期二

[prime] 簡易質數表

這是利用6n+1 , 6n+5篩選的質數表

原理是一個數字可以分解成 : 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.對於更大的質數就要另外處理了。

  1. #include <iostream>
  2. using namespace std;
  3. const int MAX = 46341;
  4. void creat(bool* prime);
  5. void filter(bool*int);
  6. int main()
  7. {
  8.     bool prime[MAX + 1] = {};  //加{}確保每個元素都指向0
  9.     creat(prime);
  10.     int n1;
  11.     while (cin >> n1){
  12.         if(prime[n1])
  13.             cout << "質數\n";
  14.         else
  15.             cout << "非質數\n";
  16.     }
  17. }
  18. //創造質數表
  19. void creat(bool* prime)
  20. {
  21.     prime[2] = prime[3] = prime[5] = 1;
  22.     //把6n+1、6n+5全設為質數
  23.     int i;
  24.     for (i=1; 6*i+5 <= MAX; i++)
  25.     {
  26.         prime[6*i+5] = prime[6*i+1] = 1;
  27.     }
  28.     if (prime[6*i+1] <= MAX)
  29.     {
  30.         prime[6*i+1] = 1;
  31.     }
  32.     //然後過濾掉6n+1、6n+5的倍數皆不為質數
  33.     int j;
  34.     for (j=0; (6*j+5)*(6*j+5) <= MAX; j++)
  35.     {
  36.        filter(prime, 6*j+5);
  37.        filter(prime, 6*j+1);
  38.     }
  39.     if (prime[6*j+1] <= MAX)
  40.     {
  41.         filter(prime, 6*j+1);
  42.     }
  43. }
  44. //過濾掉質數的倍數
  45. void filter(bool* prime, int i)
  46. {
  47.     if (prime[i])
  48.     {
  49.         for (int j=2; i*<= MAX; j++)
  50.             prime[i*j] = 0;
  51.     }
  52. }

沒有留言:

張貼留言