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

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 }

 

 

 

posted @ 2010-08-20 19:35  Eric.wei  阅读(482)  评论(0编辑  收藏  举报