2013年12月24日 星期二

[ACM] 406 Prime Cuts

題目406
寫得有點冗長,而且在ACM居然沒過。
但在其他JUDGE過了。

找時間再來修正

  1. #include <iostream>
  2. #include <vector>
  3. using namespace std;
  4. const int MAX = 1000;
  5. void creat(bool* prime);
  6. void filter(bool*int);
  7. int main()
  8. {
  9.     bool prime[MAX + 1] = {};
  10.     creat(prime);
  11.     int n1,c;
  12.     while(cin >> n1 >> c)
  13.     {
  14.         if ( n1 == 1 )
  15.         {
  16.             cout << n1 << ' ' << c << ": " << "1\n" ;
  17.             continue;
  18.         }
  19.         vector<int> box;
  20.         for (int i=1; i<=n1 ; i++)
  21.         {
  22.             if (prime[i])
  23.                 box.push_back(i);
  24.         }
  25.         int len = box.size();
  26.         if (len % 2 == 1)
  27.         {
  28.             if ( 2*c-1 > len)
  29.             {
  30.                 cout << n1 << ' ' << c << ": ";
  31.                 for (int i=0; i<len; i++)
  32.                     cout << box[i] << " ";
  33.             }
  34.             else
  35.             {
  36.             int mid = len/2, begin = mid-c+1, end = mid+c-1;
  37.             cout << n1 << ' ' << c << ": ";
  38.             for (int i=begin; i<=end; i++)
  39.                 cout << box[i] << " ";
  40.             }
  41.         }
  42.         else //len % 2 == 0
  43.         {
  44.             if ( 2*> len)
  45.                 {
  46.                     cout << n1 << ' ' << c << ": ";
  47.                     for (int i=0; i<len; i++)
  48.                         cout << box[i] << " ";
  49.                 }
  50.             else
  51.             {
  52.                 int mid = len/2, begin = mid-c, end = mid+c-1;
  53.                 cout << n1 << ' ' << c << ": ";
  54.                 for (int i=begin; i<=end; i++)
  55.                     cout << box[i] << " ";
  56.             }
  57.         }
  58.         cout << endl;
  59.     }
  60. }
  61. //創造質數表
  62. void creat(bool* prime)
  63. {
  64.     prime[2] = prime[3] = prime[5] = 1;
  65.     //把6n+1、6n+5全設為質數
  66.     int i;
  67.     for (i=1; 6*i+5 <= MAX; i++)
  68.     {
  69.         prime[6*i+5] = prime[6*i+1] = 1;
  70.     }
  71.     if (prime[6*i+1] <= MAX)
  72.     {
  73.         prime[6*i+1] = 1;
  74.     }
  75.     //然後過濾掉6n+1、6n+5的倍數皆不為質數
  76.     int j;
  77.     for (j=0; (6*j+5)*(6*j+5) <= MAX; j++)
  78.     {
  79.        filter(prime, 6*j+5);
  80.        filter(prime, 6*j+1);
  81.     }
  82.     if (prime[6*j+1] <= MAX)
  83.     {
  84.         filter(prime, 6*j+1);
  85.     }
  86.     prime[1] = 1;
  87. }
  88. //過濾掉質數的倍數
  89. void filter(bool* prime, int i)
  90. {
  91.     if (prime[i])
  92.     {
  93.         for (int j=2; i*<= MAX; j++)
  94.             prime[i*j] = 0;
  95.     }
  96. }

沒有留言:

張貼留言