Problem Description 當n為3時,我們在驗證xxx定律的過程中會得到一個序列,3,5,8,4,2,1,將3稱為關鍵數,5,8,4,2稱為覆蓋數。現在輸入n個數字a[i],根據關鍵數與覆蓋數的理論,我們只需要驗證其中部分數就可以確定所有數滿足xxx定律,輸出輸入的n個數中的關鍵數。如果其中有多個關鍵數的話按照其輸入順序的逆序輸出。 Input 輸入數據包含多個用例,每個用例首先包含一個整數n,然後接下來一行有n個整數a[i],其中: 1<=n<=500 1<a[i]<=1000 Output 請計算並輸出數組a中包含的關鍵數,並按照其輸入順序的逆序輸出,每個用例輸出占一行。 Sample Input 3 3 8 4 5 3 8 4 7 15 5 3 8 4 15 7 0 Sample Output 3 15 7 3 7 15 3 [cpp] [cpp] #include <iostream> #include <string.h> #include <cstdio> using namespace std; int main() { int n; int a[1005],i,flag[1005]; while(cin >> n && n) { memset(flag,0,sizeof(flag)); for(i = 0; i<n; i++) { cin >> a[i]; flag[a[i]] = 1; } for(i = 0; i<n; i++) { int t; t = a[i]; if(!flag[t]) continue; while(t>1) { if(t%2) t = (t*3+1)/2; else t = t/2; if(t<=1000) { flag[t] = 0; } } } int k = 1; for(i = n-1; i>=0; i--) { www.2cto.com if(flag[a[i]]) { if(k) { cout << a[i]; k = 0; } else { cout << " " << a[i]; } } } cout << endl; } return 0; }