PAT-B-1005. 繼續(xù)(3n+1)猜想 (Java)

試題描述

卡拉茲(Callatz)猜想已經(jīng)在1001中給出了描述。在這個(gè)題目里,情況稍微有些復(fù)雜。
當(dāng)我們驗(yàn)證卡拉茲猜想的時(shí)候,為了避免重復(fù)計(jì)算,可以記錄下遞推過(guò)程中遇到的每一個(gè)數(shù)。例如對(duì)n=3進(jìn)行驗(yàn)證的時(shí)候,我們需要計(jì)算3、5、8、4、2、1,則當(dāng)我們對(duì)n=5、8、4、2進(jìn)行驗(yàn)證的時(shí)候,就可以直接判定卡拉茲猜想的真?zhèn)危恍枰貜?fù)計(jì)算,因?yàn)檫@4個(gè)數(shù)已經(jīng)在驗(yàn)證3的時(shí)候遇到過(guò)了,我們稱5、8、4、2是被3“覆蓋”的數(shù)。我們稱一個(gè)數(shù)列中的某個(gè)數(shù)n為“關(guān)鍵數(shù)”,如果n不能被數(shù)列中的其他數(shù)字所覆蓋。
現(xiàn)在給定一系列待驗(yàn)證的數(shù)字,我們只需要驗(yàn)證其中的幾個(gè)關(guān)鍵數(shù),就可以不必再重復(fù)驗(yàn)證余下的數(shù)字。你的任務(wù)就是找出這些關(guān)鍵數(shù)字,并按從大到小的順序輸出它們。

輸入格式:每個(gè)測(cè)試輸入包含1個(gè)測(cè)試用例,第1行給出一個(gè)正整數(shù)K(<100),第2行給出K個(gè)互不相同的待驗(yàn)證的正整數(shù)n(1<n<=100)的值,數(shù)字間用空格隔開。

輸出格式:每個(gè)測(cè)試用例的輸出占一行,按從大到小的順序輸出關(guān)鍵數(shù)字。數(shù)字間用1個(gè)空格隔開,但一行中最后一個(gè)數(shù)字后沒有空格。

輸入樣例:63 5 6 7 8 11
輸出樣例:7 6

試題代碼

package com.hym.PAT_B;

import java.util.*;

/**
 * Created by ymhou on 2016/11/2.
 * 通過(guò)全部測(cè)試點(diǎn),答案正確
 */
public class PAT_B_1005 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        int Num[] = new int[n];
        for(int i=0; i<n; i++){
            Num[i] = scanner.nextInt();
        }

        Set<Integer> set = new HashSet<Integer>();
        int numtemp[] = new int[n];
        for(int i=0; i<n; i++){
            numtemp[i]=Num[i];
            if(set.contains(numtemp[i])){
                continue;
            }
            while(numtemp[i]!=1){
                if(numtemp[i]%2==0){
                    numtemp[i] = numtemp[i]/2;
                }else {
                    numtemp[i] = (3*numtemp[i]+1)/2;
                }
                if(set.contains(numtemp[i])){
                    break;
                }
                set.add(numtemp[i]);
            }
        }

        int outNum[] = new int[n];
        int count=0;
        for(int i=0;i<n; i++){
            if(set.contains(Num[i])){
                continue;
            }else {
                count++;
                outNum[i]=Num[i];
            }
        }

        Arrays.sort(outNum);

        for(int i=n-1; i>n-count-1; i--){
            System.out.print(outNum[i]);
            if(i==n-count){
                break;
            }
            System.out.print(" ");
        }
    }
}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容