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 }
浙公网安备 33010602011771号