PAT乙级:1005 继续(3n+1)猜想 (25 分)
微信公众号请搜索:【Codeplus】
描述:卡拉兹(Callatz)猜想已经在1001中给出了描述。在这个题目里,情况稍微有些复杂。当我们验证卡拉兹猜想的时候,为了避免重复计算,可以记录下递推过程中遇到的每一个数。例如对 n=3 进行验证的时候,我们需要计算 3、5、8、4、2、1,则当我们对 n=5、8、4、2 进行验证的时候,就可以直接判定卡拉兹猜想的真伪,而不需要重复计算,因为这 4 个数已经在验证3的时候遇到过了,我们称 5、8、4、2 是被 3“覆盖”的数。我们称一个数列中的某个数 n 为“关键数”,如果 n 不能被数列中的其他数字所覆盖。
 现在给定一系列待验证的数字,我们只需要验证其中的几个关键数,就可以不必再重复验证余下的数字。你的任务就是找出这些关键数字,并按从大到小的顺序输出它们。

题解思想:将需要验证的n个数输入存入到一个数组array[ ],然后可以建立一个大的数组a[ ],这个数组的目的是来标记被覆盖的验证数,通过一个for循环来接受每个要验证的数字,计算所覆盖的数字,然后在对应的数组a[ ]的位置置为-1,最后的结果是数组a[ ]中以数组array[ ] 内容作为下标的内容被置为-1,就可以筛选出关键数,数组a[ ] 里面没有被置为0的位置就是关键数;最后的重点就是从大到小输出,我们可以调用数组中的sort()方法将基本数组array[ ]的内容排序,默认是从小到大,所以输出时要倒序,在循环里面判定以array[ ]为下标的数组a[ ]里面如果为-1则跳过,否则就说明其没有被置为-1,就是一个关键数需要我们输出,输出数组array[ ] 对应的内容即可。

完整源码:
import java.lang.reflect.Array;
import java.util.Arrays;
import java.util.Scanner;
public class Test5 {
    public static void main(String[] args) {
        int[] a = new int[100];                       //数组a用于标记是否为关键数
        Scanner scanner = new Scanner(System.in);
        int number = scanner.nextInt();               //需要验证数的个数
        int array[] = new int[number];                //数组array存放要验证的数
        for (int i = 0; i < number; i++) {            //循环number次进行一个一个验证
            array[i] = scanner.nextInt();
            int index = array[i];                     //数组array内容作为数组a的下标
            if (a[index] == -1)                       //判定是否被标记为-1
                continue;
            else {
                while (index != 1) {                  //验证
                    if (index % 2 == 0) {
                        index = index / 2;
                        a[index] = -1;                //index被覆盖,对应数组a中置为-1
                    } else {
                        index = (3 * index + 1) / 2;
                        a[index] = -1;
                    }
                }
            }
        }                                             //验证完毕
        Arrays.sort(array);                           //对数组array排序,默认从小到大,输出时逆序进行即可
        boolean flag = false;                         //控制空格的输出
        for (int j = number - 1; j >= 0; j--) {
            if (a[array[j]] == -1)                    //被置为-1,不是关键数
                continue;
            else {
                if (flag)
                    System.out.print(" ");
                System.out.print(array[j]);
                flag = true;
            }
        }                                             //输出完毕
    }
}提交结果:











