当前位置: 代码迷 >> 综合 >> Java - PAT - 1005. 继续(3n+1)猜想 (25)
  详细解决方案

Java - PAT - 1005. 继续(3n+1)猜想 (25)

热度:73   发布时间:2023-10-09 21:10:57.0

题目地址:1005. 继续(3n+1)猜想 (25) 


思路:

输入数时,验证猜想,把过程中的数都读入一个数组,当然如果数组中已经存在,就不必继续添加。当这些数都添加后,遍历输入的数组,把过程数中没有的数挑出来,也就是关键数。简单点说,把这些数字都进行一次验证,过程所产生的所有的数字就是被覆盖的数字。那没被覆盖的数字就是关键数字。


import java.util.ArrayList;
import java.util.Collections;
import java.util.Scanner;  
public class Main{  public static void main(String[] args){  Scanner sc = new Scanner(System.in);  int n = sc.nextInt();int[]a1 = new int[n];		//进行操作的数组int[]a2 = new int[n];ArrayList<Integer>alist1 = new ArrayList<Integer>();		//被覆盖数ArrayList<Integer>alist2 = new ArrayList<Integer>();		//关键数for(int i=0 ;i<n ;i++){a2[i] = sc.nextInt();a1[i] = a2[i];while(a1[i]!=1){				//将覆盖数添加到alist1中if(a1[i]%2==0){a1[i] /=2;if(!alist1.contains(a1[i])){alist1.add(a1[i]);}else{break;}}else{a1[i] = (3*a1[i]+1)/2;if(!alist1.contains(a1[i])){alist1.add(a1[i]);}else{break;}}}}for(int i=0 ;i<a2.length ;i++){			//遍历输入的数组 if(!alist1.contains(a2[i])){		//在覆盖数中没有的话alist2.add(a2[i]);				//添加到alist2 即关键数}}Collections.sort(alist2);if(alist2.size()==1){System.out.println(alist2.get(0));}else{for(int i=alist2.size()-1 ;i>=0 ;i--){System.out.print(alist2.get(i));if(i!=0){System.out.print(" ");}}System.out.println();}}
}

其实代码就是那么写字母,学一阵子就差不多都掌握了,主要是思路,训练好思维很重要,比如说这道题让求关键数字,要知道关键数就是没被覆盖的数字。直接求没被覆盖的数字不好求又或者不能求的话,那就从另一面考虑,先求出被覆盖的数字,那么剩下的数字就是没被覆盖的数字。

  相关解决方案