首页 > 代码库 > PAT 乙级 1005. 继续(3n+1)猜想 (25)

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

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

时间限制
400 ms
内存限制
65536 kB
代码长度限制
8000 B
 

卡拉兹(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


 1 import java.util.*;
 2 
 3 public class Main
 4 {
 5     static Scanner scan = new Scanner(System.in);
 6     public static void main(String[] args)
 7     {
 8         int[] flag = new int[110];
 9         for (int i = 0; i < 110; ++i)
10             flag[i] = -1;
11         int k = scan.nextInt();
12         while ( k-- != 0)
13         {
14             int t = scan.nextInt();
15             if ( flag[t] == -1 )
16             {
17                 flag[t] = 0;
18                 while ( t != 1)
19                 {
20                     if ( t % 2 == 1)
21                     {
22                         t = ( 3 * t + 1) / 2;
23                         if ( t < 101)  //在公式的递推中,n远大于100,测试时数组为500仍然越界,但是大于100的数据我们可以不理会
24                             flag[t] = 1;
25                     }
26                     else
27                     {
28                         t /= 2;
29                         if ( t < 101 ) //!!!此处的n可能因为上次奇数的计算即使/2后仍然越界
30                             flag[t] = 1;
31                     }
32                 }
33             }
34         }
35         
36         boolean b = true;
37         for (int j = 101; j > 1; --j)
38         {
39             if ( flag[j] == 0)
40             {
41                 if ( b ) 
42                 {
43                     System.out.print(j);
44                     b = false;
45                 }
46                 else
47                 {
48                     System.out.print(" " + j);
49                 }
50                     
51             }
52         }
53     }
54 }

 

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