全国软件专业人才开发与设计赛题之中等题“五位数黑洞”

2.1由任意的五位数,比如:72962,对此五位数的五个数字进行排序,组成最大的数A,最小的数B,然后求其差C,

那么我们称next(A)-->C,以此递推,当五位数不足5位,前面补0 ,最终每个五位数均会进入一种循环圈中,这种循环圈成为“五位黑洞”

特殊的当五位数所有数字相同时,输出[0] 

求解所有的五位黑洞

版权声明版权归作者WeiSteven所有,转载请注明! 

输出格式为:

[_,_,_,_,]

每行一个圈

  1  #include  < stdio.h >
  2  #include  < string .h >
  3 
  4  // 构造位运算结构
  5  // 目的是减少内存占用
  6  // 由于数据是五位数,所以按照位操作100000/8=12500,所以对应于12500即可
  7  char  bit[ 12501 ]; // 用于记录数据,用bit来进行记录,1代表之前测试过这个数,但不一定输出过
  8  char  bitPrintf[ 12501 ]; // 1代表以及输出
  9  char  bitCurr[ 12501 ]; // 代表本次扩展访问的数的标注
 10 
 11  // 设置bitCurr中的对应的位
 12  void  setcbit( long  t) // 纪录t位
 13  {
 14      bitCurr[t >> 3 ] |= ( 0x01 << (t & 0x07 ));
 15  }
 16 
 17  // 取得bitCurr标记中的对应t的那位状态
 18  int  getcbit( long  t)
 19  {
 20       int  arrindex = t >> 3 ;
 21       int  ch = 0x01 << (t & 0x07 );
 22       if (bitCurr[arrindex] & (ch)) // 这是取得t/8对应的char 的第t%8位数据
 23           return   1 ;
 24       else
 25           return   0 ;
 26  }
 27 
 28  // 设置bitPrint中的对应的位
 29  void  setbit( long  t) // 纪录t位
 30  {
 31      bit[t >> 3 ] |= ( 0x01 << (t & 0x07 ));
 32  }
 33 
 34  // 取得标记中的对应t的那位状态
 35  int  getbit( long  t)
 36  {
 37       int  arrindex = t >> 3 ;
 38       int  ch = 0x01 << (t & 0x07 );
 39       if (bit[arrindex] & (ch)) // 这是取得t/8对应的char 的第t%8位数据
 40           return   1 ;
 41       else
 42           return   0 ;
 43  }
 44 
 45  void  setpbit( long  t) // 纪录t位
 46  {
 47      bitPrintf[t >> 3 ] |= ( 0x01 << (t & 0x07 ));
 48  }
 49 
 50  // 取得标记中的对应t的那位状态
 51  int  getpbit( long  t)
 52  {
 53       int  arrindex = t >> 3 ;
 54       int  ch = 0x01 << (t & 0x07 );
 55       if (bitPrintf[arrindex] & (ch)) // 这是取得t/8对应的char 的第t%8位数据
 56           return   1 ;
 57       else
 58           return   0 ;
 59  }
 60 
 61 
 62  // 函数对num所能排列成的任何数据进行标记
 63  // 如若已经出现过,则返回0,否则返回1
 64  int  setFlag( long  num)
 65  {
 66       return   1 ;
 67  }
 68 
 69  // 排序,对分离的五位数字进行排序
 70  void  sort( int   * b)
 71  {
 72       int  t;
 73       for ( int  i = 0 ;i < 5 ;i ++ )
 74      {
 75           for ( int  j = i + 1 ;j < 5 ;j ++ )
 76          {
 77               if (b[i] < b[j])
 78              {
 79                  t = b[i];
 80                  b[i] = b[j];
 81                  b[j] = t;
 82              }
 83          }
 84      }
 85  }
 86 
 87  /* ---------------------------
 88  根据当前的数据t,得到下一个数据
 89  ---------------------------- */
 90  long  getNextNumber( long  t)
 91  {
 92       int  b[ 5 ];
 93       for ( int  i = 0 ;i < 5 ;i ++ )
 94      {
 95          b[i] = t % 10 ;
 96          t /= 10 ;
 97      }
 98      sort(b);
 99       long  maxNum = b[ 0 ] * 10000 + b[ 1 ] * 1000 + b[ 2 ] * 100 + b[ 3 ] * 10 + b[ 4 ];
100       long  minNum = b[ 4 ] * 10000 + b[ 3 ] * 1000 + b[ 2 ] * 100 + b[ 1 ] * 10 + b[ 0 ];
101       return  maxNum - minNum;
102  }
103 
104  // 通过给定的一个数,可以搜索所有可以生成的数,并判断是否进入了五位圈
105  void  findCyle( long  t)
106  {
107      memset(bitCurr, 0 , sizeof (bitCurr));
108       while (getbit(t) == 0 ) // 找到下一个数
109      {
110          setbit(t);
111          setcbit(t);
112          t = getNextNumber(t);
113      }
114       if (getcbit(t) == 1   &&  getpbit(t) == 0 ) // 这次访问,还没输出过,进入循环判断输出阶段
115      {
116          setpbit(t);
117          printf( " [%ld " ,t);
118           while ( 1 ) // 找到下一个数
119          {
120              t = getNextNumber(t);
121               if (getpbit(t) == 0 )
122              {
123                  setpbit(t);
124                  printf( " ,%ld " ,t);
125              }
126               else
127              {
128                  printf( " ]\n " );
129                   break ;
130              }
131          }
132      }
133  }
134 
135 
136  int  main()
137  {
138      memset(bit, 0 , sizeof (bit)); // 清空数据
139       // 考虑到时间复杂度,对特殊数据进行了特殊处理
140      setpbit( 11111 );
141      setpbit( 22222 );
142      setpbit( 33333 );
143      setpbit( 44444 );
144      setpbit( 55555 );
145      setpbit( 66666 );
146      setpbit( 77777 );
147      setpbit( 88888 );
148      setpbit( 99999 );
149      setbit( 11111 );
150      setbit( 22222 );
151      setbit( 33333 );
152      setbit( 44444 );
153      setbit( 55555 );
154      setbit( 66666 );
155      setbit( 77777 );
156      setbit( 88888 );
157      setbit( 99999 );
158       // 设置形同的数不进行判断
159       // printf("%ld\n",getNextNumber(82962));
160 
161      printf( " [0]\n " );
162      
163       for ( long  i = 10000 ;i < 100000 ;i ++ )
164      {
165           if (getbit(i) == 0 ) // 表明这个数还没进入任何一个圈,要进行判断
166          {
167              findCyle(i);
168          }
169      }
170      
171       return   1 ;
172  }

 

 

 

你可能感兴趣的:(全国软件专业人才开发与设计赛题之中等题“五位数黑洞”)