1. 程式人生 > >PAT 1005. 繼續(3n+1)猜想 (25) java

PAT 1005. 繼續(3n+1)猜想 (25) java

卡拉茲(Callatz)猜想已經在1001中給出了描述。在這個題目裡,情況稍微有些複雜。

當我們驗證卡拉茲猜想的時候,為了避免重複計算,可以記錄下遞推過程中遇到的每一個數。例如對n=3進行驗證的時候,我們需要計算3、5、8、4、2、1,則當我們對n=5、8、4、2進行驗證的時候,就可以直接判定卡拉茲猜想的真偽,而不需要重複計算,因為這4個數已經在驗證3的時候遇到過了,我們稱5、8、4、2是被3“覆蓋”的數。我們稱一個數列中的某個數n為“關鍵數”,如果n不能被數列中的其他數字所覆蓋。

現在給定一系列待驗證的數字,我們只需要驗證其中的幾個關鍵數,就可以不必再重複驗證餘下的數字。你的任務就是找出這些關鍵數字,並按從大到小的順序輸出它們。

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

輸出格式:每個測試用例的輸出佔一行,按從大到小的順序輸出關鍵數字。數字間用1個空格隔開,但一行中最後一個數字後沒有空格。

覆蓋數:在其它輸入值的計算過程中出現的中間值 

關鍵數:非覆蓋數  

那麼我的思路就是先獲得所有的覆蓋數,然後在輸入值中遍歷,然後記錄包含的覆蓋數,其他的就是關鍵數了。

import java.util.ArrayList;
import java.util.Collections;
import 
java.util.List; import java.util.Scanner;/* 先計算出每一個數的集合 拿每個數去判斷是否覆蓋 不覆蓋的,則就是關鍵數 */ public class no1005 { public static void main(String args[]){ Scanner scanner = new Scanner(System.in); new Integer(scanner.nextLine()); String input =scanner.nextLine(); String[] i = input.split("\\s"
); List<List<Integer>> list =new ArrayList<>(); List<Integer> result=new ArrayList<>(); for(int q=0;q<i.length;q++){//遍歷獲得 每個輸入數的覆蓋數 int n=new Integer(i[q]); List<Integer> temp=new ArrayList<>(); for( int w=0;n!=1;w++){ if(n%2==0){ n=n/2; }else { n=(3*n+1)/2; } temp.add(n); } list.add(temp); } for(List<Integer> list1:list){//匹配每個輸入數是否是覆蓋數 for(String s:i){ int temp= new Integer(s); for(Integer ii :list1){ if(ii.equals(temp)){ if(!result.contains(temp)) { result.add(temp); } } } } } List<Integer> list2=new ArrayList<>(); for(String s:i){//輸入的數,且不為覆蓋數的 if(!result.contains(new Integer(s))){ list2.add(new Integer(s)); } } Collections.sort(list2); for (int xx= list2.size();xx>0;xx--){ System.out.print(list2.get(xx-1)); // System.out.println(xx); if(xx>1){ System.out.print(" ");//是否最後一個字元 } } } }