PAT-乙級-Java-1005(部分正確)
阿新 • • 發佈:2018-12-01
1005 繼續(3n+1)猜想 (25 分)
卡拉茲(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 個空格隔開,但一行中最後一個數字後沒有空格。
輸入樣例:
6 3 5 6 7 8 11
輸出樣例:
7 6
Java程式碼實現:
import java.util.ArrayList; import java.util.List; import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner input = new Scanner(System.in); int num = input.nextInt();//第一次輸入的值:總共幾個數 input.nextLine(); String str = input.nextLine();//輸入要進行卡拉茲猜想的字串 business(num,str); } public static void business(int num,String str){ String split [] = new String [num];//分割後的字串陣列 split = str.split(" ", num); int [] splitInt = new int [num];//定義int型別的陣列 for(int i = 0;i<num;i++){ splitInt[i] = Integer.parseInt(split[i]);//將字串資料轉為整形資料 } List<Integer> keyNum = new ArrayList<Integer>();//定義一個列表,用來存放關鍵數 List<Integer> middle = new ArrayList<Integer>();//定義一個列表,用來存放在驗證卡拉茲猜想過程中產生的n //驗證卡拉茲猜想 for(int i = 0;i<num;i++){//遍歷要進行驗證的每一個數據 int ele = splitInt[i]; if(!middle.contains(splitInt[i])){//當前要驗證的資料是關鍵數,需要再進行驗證 //將該數加入到關鍵數list中,第一個數是不用新增的 if(i != 0){ keyNum.add(ele); } int m = -1;//過程中要進行奇偶判斷的數 int n = ele;//過程中的n //對該數進行卡拉茲猜想 while(n>1){ //每次迴圈產生的中間數也要進行對比 if(middle.contains(n)){//已驗證過,跳出迴圈 break; } middle.add(n);//每次驗證的n都應放入到被驗證的列表中 if(n%2 == 0){ //偶數 m = n; }else{ m = 3*n+1; } n = m/2; } } } //將關鍵數列表轉為陣列,然後呼叫氣泡排序方法進行排序輸出 int [] array = new int[keyNum.size()]; for(int i = 0;i<array.length;i++){ array[i] = keyNum.get(i); } bubbleSort(array); } //氣泡排序從大到小 public static void bubbleSort(int [] arr){ for(int i = 0;i<arr.length-1;i++){ for(int j = 0;j<arr.length-i-1;j++){ if(arr[j]<arr[j+1]){ int temp = arr[j]; arr[j] = arr[j+1]; arr[j+1] = temp; } } } for(int i = 0;i<arr.length;i++){ String s = ""; if(i == arr.length-1){ s = arr[i]+""; }else{ s = arr[i]+" "; } System.out.print(s); } } }