1. 程式人生 > >PAT-乙級-Java-1005(部分正確)

PAT-乙級-Java-1005(部分正確)

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);
		}
	}

}