PAT乙級1005-繼續3n+1猜測

卡拉茲(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;
    
}
相關文章
相關標籤/搜索