0
点赞
收藏
分享

微信扫一扫

PAT乙级:1005 继续(3n+1)猜想 (25 分)


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 不能被数列中的其他数字所覆盖。
现在给定一系列待验证的数字,我们只需要验证其中的几个关键数,就可以不必再重复验证余下的数字。你的任务就是找出这些关键数字,并按从大到小的顺序输出它们。

PAT乙级:1005 继续(3n+1)猜想 (25 分)_算法

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

PAT乙级:1005 继续(3n+1)猜想 (25 分)_数据结构_02

完整源码:

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;
}
} //输出完毕
}
}

提交结果:

PAT乙级:1005 继续(3n+1)猜想 (25 分)_java_03



举报

相关推荐

0 条评论