全国软件专业人才开发与设计赛题之中等题“五位数黑洞”
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 }
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 }
作者:W.M.steve
出处:http://www.cnblogs.com/weisteve/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
出处:http://www.cnblogs.com/weisteve/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。