卡拉茲(Callatz)猜測已經在1001中給出了描述。在這個題目裏,狀況稍微有些複雜。測試
當咱們驗證卡拉茲猜測的時候,爲了不重複計算,能夠記錄下遞推過程當中遇到的每個數。例如對n=3進行驗證的時候,咱們須要計算三、五、八、四、二、1,則當咱們對n=五、八、四、2進行驗證的時候,就能夠直接斷定卡拉茲猜測的真僞,而不須要重複計算,由於這4個數已經在驗證3的時候遇到過了,咱們稱五、八、四、2是被3「覆蓋」的數。咱們稱一個數列中的某個數n爲「關鍵數」,若是n不能被數列中的其餘數字所覆蓋。spa
如今給定一系列待驗證的數字,咱們只須要驗證其中的幾個關鍵數,就能夠沒必要再重複驗證餘下的數字。你的任務就是找出這些關鍵數字,並按從大到小的順序輸出它們。code
輸入格式:每一個測試輸入包含1個測試用例,第1行給出一個正整數K(<100),第2行給出K個互不相同的待驗證的正整數n(1<n<=100)的值,數字間用空格隔開。blog
輸出格式:每一個測試用例的輸出佔一行,按從大到小的順序輸出關鍵數字。數字間用1個空格隔開,但一行中最後一個數字後沒有空格。內存
輸入樣例:6 3 5 6 7 8 11輸出樣例:
7 6
1 #include<stdio.h> 2 #include<math.h> 3 #include<stdlib.h> 4 #include<string.h> 5 #include<algorithm> 6 using namespace std; 7 8 bool cmp(int x, int y) 9 { 10 return x > y; 11 } 12 13 int main() 14 { 15 int a[110], hashtable[110] = {}; 16 int k, i; 17 scanf("%d", &k); 18 for(i = 0; i < k; i++) 19 { 20 scanf("%d", &a[i]); 21 int temp = a[i]; 22 while(temp != 1) 23 { 24 if(temp % 2 == 0) 25 { 26 temp /= 2; 27 if(temp <= 100) 28 { 29 hashtable[temp] = 1; 30 } 31 } 32 else 33 { 34 temp = (3 * temp + 1) / 2; 35 if(temp <= 100) 36 { 37 hashtable[temp] = 1; 38 } 39 } 40 } 41 } 42 int b[110], j = 0; 43 sort(a, a + k, cmp); 44 for(i = 0; i < k; i++) 45 { 46 int temp = a[i]; 47 if(hashtable[temp] == 0) 48 { 49 b[j++] = a[i]; 50 } 51 } 52 for(i = 0; i < j - 1; i++) 53 { 54 printf("%d ", b[i]); 55 } 56 printf("%d\n", b[j - 1]); 57 return 0; 58 }