This is a funny programm and I don't why it happens in this way.
No matter what data input that is composed with different numbers, like 123456,
124578, 235689, 789456, 147896, 321478 and so on. through this program, it will
get a same data ever got.
1 // funny program by JonsenElizee.
2 //
3
4 #include "stdafx.h"
5 #include <math.h>
6 #include <assert.h>
7 /*
8 * set value in specified position.
9 * void* ptr pointer of the start point of bit.
10 * int pos position of the bit to be set and pos starts from 0.
11 * int val value to set. val is 0 or 1.
12 */
13 void setbit(void* ptr, int pos, int val)
14 {
15 /* cast to unsigned char* type pointer */
16 unsigned char* uch = (unsigned char*)ptr;
17
18 /* move pointer */
19 uch += pos/8;
20
21 /* set the bit with right value, 0 or 1. */
22 unsigned char tmp = 1 << (pos%8);
23 if ( val && (unsigned char)(*uch & tmp) == 0) *uch += tmp;
24 else *uch -= tmp;
25 }
26 unsigned char getbit(void* ptr, int pos)
27 {
28 /* cast to unsigned char* type pointer */
29 unsigned char* uch = (unsigned char*)ptr;
30
31 /* move pointer */
32 uch += pos/8;
33
34 /* set the bit with right value, 0 or 1. */
35 unsigned char tmp = 1 << (pos%8);
36 return (unsigned char)(*uch & tmp);
37 }
38
39 unsigned revert_unsigned_int(unsigned ipt)
40 {
41 unsigned opt = 0;
42 unsigned short i = 0;
43 for(opt = ipt; opt != 0; opt /= 10, i++);
44 for(opt = 0; ipt != 0; ipt /= 10)
45 opt += (ipt - ipt / 10 * 10) * ((unsigned)pow(10, --i));
46 return opt;
47 }
48
49 unsigned sort_unsigned_int(unsigned ipt, int ascend)
50 {
51 unsigned opt = 0;
52 unsigned i = 0;
53
54 /* get length of input data */
55 for(opt = ipt; opt != 0; opt /= 10, i++);
56
57 unsigned char* num = (unsigned char *)malloc(i);
58 memset(num, 0, i);
59 unsigned char* ptr = num;
60 unsigned char* mov = ptr + 1;
61 unsigned n = i;
62
63 /* get each number char of input data */
64 for(; ipt != 0; ipt /= 10)
65 num[--i] = (unsigned char)(ipt - ipt / 10 * 10);
66
67 /* sort the number */
68 for(i = 0; i < n-1; i ++) {
69 if(ascend) {
70 while(mov > num && mov[0] < mov[-1]) {
71 mov[0] ^= mov[-1];
72 mov[-1] ^= mov[0];
73 mov[0] ^= mov[-1];
74 mov--;
75 }
76 }
77 else {
78 while(mov > num && mov[0] > mov[-1]) {
79 mov[0] ^= mov[-1];
80 mov[-1] ^= mov[0];
81 mov[0] ^= mov[-1];
82 mov--;
83 }
84 }
85 ptr++;
86 mov = ptr+1;
87 }
88
89 /* convert to a unsigned int */
90 for (opt = i = 0; i < n; i++)
91 {
92 opt += num[i] * ((unsigned)pow(10, n-i-1));
93 }
94
95 free(num);
96 return opt;
97 }
98
99 void loop_to_original_data(unsigned ipt)
100 {
101 assert(ipt < 1000000);
102 char his[1000000] = {0};
103 while(1) {
104 printf("%d ", ipt);
105 unsigned a = sort_unsigned_int(ipt, 1);
106 unsigned b = sort_unsigned_int(ipt, 0);
107 if(a == b) {
108 printf("%d\n", ipt);
109 return;
110 }
111 unsigned rst = b - a;
112 if (getbit(his, rst)) {
113 printf("%d\n", rst);
114 break;
115 }
116 else
117 setbit(his, rst, 1);
118 ipt = rst;
119 }
120 }
121
122 int main()
123 {
124 loop_to_original_data(123456);
125 getchar();
126 return 0;
127 }
128
129