卡拉茲(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)的值,數字間用空格隔開。排序
輸出格式:it
每一個測試用例的輸出佔一行,按從大到小的順序輸出關鍵數字。數字間用 1 個空格隔開,但一行中最後一個數字後沒有空格。io
輸入樣例:sort
6
3 5 6 7 8 11di
請輸入代碼 // // main.cpp // PAT // // Created by mac on 2019/7/1. // Copyright © 2019年 mac_caoweihua. All rights reserved. // #include <cstdio> #include <algorithm> using namespace std; bool cmp(int a,int b){ return a>b ; //從大到小排序 } int main(){ int K,num,n[100];//K是輸入第一行的數字,n[]存輸入的數字 //printf("\n"); //不加這一句Xcode沒法執行scanf函數可是加了這句提交格式就不對了。 scanf("%d",&K); bool HashTable[10000]={0};//若是設爲100會發生越界,段錯誤;HashTable[x]==true 表示x被覆蓋。 for(int i=0;i<K;i++){ scanf("%d",&n[i]); num=n[i]; while(num!=1){ //對num進行3*n+1猜測 if(num%2==1){ num=(3*num+1)/2; } else{ num=num/2; } HashTable[num]=true; } } int count=0;//count計數關鍵數個數 for(int i=0;i<K;i++){ if(HashTable[n[i]]==false){ //沒被覆蓋 count++; } } sort(n,n+K,cmp);//從大到小排序 for(int i=0;i<K;i++){ if(HashTable[n[i]]==false){ printf("%d",n[i]); count--; if(count>0){ printf(" ");//控制輸出格式 } } } return 0; }