2013年12月28日 星期六

[範例] 質數又來了


質數又來了
這次是給你兩個數字
算出介在這兩者間的質數有幾個
其實差不多,直接看下去吧


  1. #include <iostream>
  2. #include <vector>
  3. using namespace std;
  4. const int MAX = 46341;
  5. void creat(bool* prime);
  6. void filter(bool*int);
  7. int main()
  8. {
  9.     bool prime[MAX + 1] = {};  //加{}確保每個元素都指向0
  10.     creat(prime);
  11.     vector<int> prim;
  12.     for (int i=0 ;i<MAX; i++)
  13.     {
  14.         if(prime[i])
  15.         {
  16.             prim.push_back(i);
  17.         }
  18.     }
  19.     int a, b;
  20.     while (cin >> a >> b){
  21.         int count = 0;
  22.        if (<= MAX)
  23.        {
  24.            for (int i=a; i<=b; i++)
  25.            {
  26.                if(prime[i])
  27.                {
  28.                    count++;
  29.                }
  30.            }
  31.        }
  32.        else
  33.        {
  34.            vector<int>::iterator p;
  35.            for (int i=a; i<=b; i++)
  36.            {
  37.                 int notprime = 0;
  38.                 for (= prim.begin(); p != prim.end(); p++)
  39.                 {
  40.                     if (% (*p) == 0)
  41.                     {
  42.                         notprime = 1;
  43.                         break;
  44.                     }
  45.                 }
  46.                 if (notprime == 0)
  47.                 count++;
  48.            }
  49.        }
  50.        cout << count << endl;
  51.     }
  52. }
  53. //創造質數表
  54. void creat(bool* prime)
  55. {
  56.     prime[2] = prime[3] = prime[5] = 1;
  57.     //把6n+1、6n+5全設為質數
  58.     int i;
  59.     for (i=1; 6*i+5 <= MAX; i++)
  60.     {
  61.         prime[6*i+5] = prime[6*i+1] = 1;
  62.     }
  63.     if (prime[6*i+1] <= MAX)
  64.     {
  65.         prime[6*i+1] = 1;
  66.     }
  67.     //然後過濾掉6n+1、6n+5的倍數皆不為質數
  68.     int j;
  69.     for (j=0; (6*j+5)*(6*j+5) <= MAX; j++)
  70.     {
  71.        filter(prime, 6*j+5);
  72.        filter(prime, 6*j+1);
  73.     }
  74.     if (prime[6*j+1] <= MAX)
  75.     {
  76.         filter(prime, 6*j+1);
  77.     }
  78. }
  79. //過濾掉質數的倍數
  80. void filter(bool* prime, int i)
  81. {
  82.     if (prime[i])
  83.     {
  84.         for (int j=2; i*<= MAX; j++)
  85.             prime[i*j] = 0;
  86.     }
  87. }

沒有留言:

張貼留言