pat1005

思路:上网看了别人可以用散列做,大概思路:

(1)设置一个mark初始化为-1的数组,并将输入的n个数的每个数作为mark的下标并使值为0.

(2)然后在套用for循环进行遍历,例如3,遍历过后的58421都会使mark下标为58421的值为1.

(3)最后设置输出的时候,用flag进行判定,如果flag为0,直接输出值就行,否则输出空格加值

(4)代码有错误,关于数组越界,等下会改的。

 1 #include <iostream>
 2 #include <stdio.h>
 3 #include <string.h>
 4 using namespace std;
 5 
 6 int main()
 7 {
 8     int n,x,flag=0;
 9     scanf("%d",&n);
10     int mark[101];
11     memset(mark,-1,sizeof(mark));
12     for(int i=0;i<n;i++)
13     {
14         scanf("%d",&x);
15         mark[x]=0;
16     }
17 //    for(int i=0;i<101;i++)
18 //    {
19 //        if(mark[i]==0)
20 //            printf("%d",i);
21 //    }
22     for(int i=2;i<=100;i++)
23     {
24         int j=i;
25         if(mark[j]==0)
26         {
27             while(j!=2)
28             {
29                 if(j%2==0)
30                 {
31                     j=j/2;
32                     if(j<100)
33                     mark[j]=1;
34                 }
35                 else
36                 {
37                     j=(3*j+1)/2;
38                     mark[j]=1;
39                 }
40             }
41         }
42     }
43 
44     for(int i=100;i>=0;i--)
45     {
46         if(mark[i]==0&&flag==0)
47         {
48             printf("%d",i);
49             flag=1;
50             continue;
51         }
52         if(mark[i]==0&&flag==1)
53             printf(" %d",i);
54     }
55     return 0;
56 }

 

posted @ 2023-02-17 20:41  yaoyaoasddasdsa  阅读(17)  评论(0)    收藏  举报