PAT(B) 1005 继续(3n+1)猜想(Java)

题目链接:1005 继续(3n+1)猜想
分析

 找出所有的被“覆盖”的数,然后再将输入的数不在被“覆盖”的数中的添加到“关健数”中。输出前先转成数组并升序排序,降序输出即可。

代码
/**
 * Score 25
 * Run Time 151ms
 * @author wowpH
 * @version 1.1
 */

import java.io.BufferedInputStream;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Scanner;

public class Main {
	public int k; 		// 待验证的数的个数
	public int[] num; 	// 待验证的数
	private List<Integer> ans; 		// 关键数
	private List<Integer> cover;	// 被“覆盖”的数

	public Main() {
		ans = new ArrayList<Integer>();
		cover = new ArrayList<Integer>();
		input(); 	// 输入
		setCover();	// 计算被“覆盖”的数
		setAns(); 	// 计算关健数
		output(); 	// 输出
	}

	private void input() {
		Scanner sc = new Scanner(new BufferedInputStream(System.in));
		k = sc.nextInt();
		num = new int[k];
		for (int i = 0; i < k; i++) {
			num[i] = sc.nextInt();
		}
		sc.close();
	}

	private void setCover() {
		for (int i : num) {
			while (i > 1) {
				if (0 == (i & 1)) {
					i /= 2;
				} else {
					i = (i * 3 + 1) / 2;
				}
				if (cover.contains(i)) { // i已经被“覆盖”
					break;
				}
				cover.add(i); 	// 若未覆盖,添加到被“覆盖”的数中
			}
		}
	}

	private void setAns() {
		for (int i : num) {
			if (!cover.contains(i)) {	// 输入的数,若未被覆盖
				ans.add(i); 			// 则添加到关键数中
			}
		}
	}

	private void output() {
		Object[] arr = ans.toArray();
		Arrays.sort(arr); 	// 升序排序
		for (int i = arr.length - 1; i > 0; i--) {	// 降序输出
			System.out.print(arr[i] + " ");
		}
		if (arr.length > 0) {
			System.out.println(arr[0]); 	// 最后一个数,换行
		}
	}

	public static void main(String[] args) {
		new Main();
	}
}
原文地址:https://www.cnblogs.com/wowpH/p/11060790.html