数字黑洞[本地编译通过,OJ未通过]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
1019 数字黑洞 (20分)
给定任一个各位数字不完全相同的 4 位正整数,如果我们先把 4 个数字按非递增排序,再按非递减排序,然后用第 1 个数字减第 2 个数字,将得到一个新的数字。一直重复这样做,我们很快会停在有“数字黑洞”之称的 6174,这个神奇的数字也叫 Kaprekar 常数。

例如,我们从6767开始,将得到

7766 - 6677 = 1089
9810 - 0189 = 9621
9621 - 1269 = 8352
8532 - 2358 = 6174
7641 - 1467 = 6174
... ...



现给定任意 4 位正整数,请编写程序演示到达黑洞的过程。

输入格式:
输入给出一个正整数 N。

输出格式:
如果 N 的 4 位数字全相等,则在一行内输出 N - N = 0000;否则将计算的每一步在一行内输出,直到 6174 作为差出现,输出格式见样例。注意每个数字按 4 位数格式输出。

输入样例 1:
6767



输出样例 1:
7766 - 6677 = 1089
9810 - 0189 = 9621
9621 - 1269 = 8352
8532 - 2358 = 6174



输入样例 2:
2222



输出样例 2:
2222 - 2222 = 0000

我写的辣鸡代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
#include <stdio.h>
#include <string.h>

int h2l(int arr[])
{
int res=0;
int len=4;
//选择排序,由大到小
for(int i=0;i<len;++i)
{
for(int j=i+1;j<len;++j)
{
if(arr[j]>arr[i])
{
int temp;
temp=arr[i];
arr[i]=arr[j];
arr[j]=temp;
}
}
}
res=arr[0]*1000+arr[1]*100+arr[2]*10+arr[3];
return res;
}




int l2h(int arr[])
{
int res=0;
int len=4;
//选择排序,由小到大
for(int i=0;i<len;++i)
{
for(int j=i+1;j<len;++j)
{
if(arr[j]<arr[i])
{
int temp;
temp=arr[i];
arr[i]=arr[j];
arr[j]=temp;
}
}
}
res=arr[0]*1000+arr[1]*100+arr[2]*10+arr[3];
return res;
}

int main()
{
char str[10];
gets(str);
int len=strlen(str);
int arr[len];
for(int i=0;i<len;++i)
arr[i]=str[i]-'0';
int high=h2l(arr);//非递增排列
int low=l2h(arr);//非递减排列,注意前面有0被去掉
if(high==low)
printf("%d-%d=0000",high,low);
else{
int aa[4];
while((high-low)!=6174)
{
printf("%d-",high);
if(low<=999)
{
if(low<=99)
{
if(low<=9)
printf("000%d=",low);
else
printf("00%d=",low);

}
else
printf("0%d=",low);
}
else
printf("%d=",low);

int c=high-low;
if(c<=999)
{
if(c<=99)
{
if(c<=9)
{
printf("000%d",c);
aa[0]=0;aa[1]=0;aa[2]=0;aa[3]=c;
}
else
{
printf("00%d",c);
aa[0]=0;aa[1]=0;
aa[2]=c/10;
aa[3]=c%10;
}
}
else
{
printf("0%d",c);
aa[0]=0;
aa[1]=c/100;
aa[2]=(c%100)/10;
aa[3]=(c%100)%10;
}
}
else
{
printf("%d",c);
aa[0]=c/1000;
aa[1]=(c%1000)/100;
aa[2]=((c%1000)%100)/10;
aa[3]=((c%1000)%100)%10;
}
printf("\n");

high=h2l(aa);
low=l2h(aa);
}
printf("%d-",high);
if(low<=999)
{
if(low<=99)
{
if(low<=9)
printf("000%d=",low);
else
printf("00%d=",low);

}
else
printf("0%d=",low);
}
else
printf("%d=",low);
printf("6174");

}
}

凡希 wechat
喜欢所以热爱,坚持干货分享,欢迎订阅我的微信公众号
呐,请我吃辣条