7-44 黑洞数(20 分)

黑洞数也称之为陷阱数,又称“Kaprekar难点”,是①类具备奇特调换天性的数。

任何1个各位数字不全同样的肆人数,经有限次“重排求差”操作,总会获得495。最终所得的4九五即为三人黑洞数。所谓“重排求差”操作即整合该数的数字重排后的最大数减去重排后的细小数。(6174为四位黑洞数。)

例如,对2人数20⑦:

  • 第3次重排求差得:720 – 27 = 6玖叁;
  • 第壹遍重排求差得:九6叁 – 36玖 = 5玖四;
  • 第贰回重排求差得:95四 – 45九 = 4九五;

然后会停留在495这1黑洞数。假设几人数的贰个数字全同样,贰回转变后即为0。

专擅输入3个几位数,编制程序给出重排求差的进度。

输入格式:

输入在一行中提交贰个几人数。

输出格式:

规行矩步以下格式输出重排求差的进程:

序号: 数字重排后的最大数 - 重排后的最小数 = 差值

 

序号从一方始,直到4九5出现在等号左边甘休。

输入样例:

123

输出样例:

1: 321 - 123 = 198
2: 981 - 189 = 792
3: 972 - 279 = 693
4: 963 - 369 = 594
5: 954 - 459 = 495

 

 1 #include <stdio.h>
 2 
 3 int number(int a[], int len, int flag);
 4 int max(int a[], int len);
 5 void dd(int a[], int n);
 6 
 7 int main(int argc, char const *argv[])
 8 {
 9     int n;
10     int a[3];
11 
12     scanf("%d", &n);
13 
14     int len = sizeof(a)/sizeof(a[0]);
15     
16     // 输入的数是495也要输出一次
17     for ( int i = 1; n != 495 || i == 1; i++ ) {
18         dd(a,n);
19         //    选择排序
20         for ( int i = len-1; i > 0; i-- ) {
21             int maxid = max(a,i+1);
22             // swap a[maxid], a[len-1]
23             int t = a[maxid];
24             a[maxid] = a[i];
25             a[i] = t;
26         }
27         // 1-->mim 0-->max
28         int min = number(a,sizeof(a)/sizeof(a[0]),1);
29         int max = number(a,sizeof(a)/sizeof(a[0]),0);
30         if ( min == max ) {    // 三位数的3个数是否相同
31             printf("%d: %d - %d = %d\n", i, max, min, max-min);
32             break;
33         } else {
34             printf("%d: %d - %d = %d\n", i, max, min, max-min);
35         }
36         n = max - min;
37     }
38     
39     return 0;
40 }
41 
42 int number(int a[], int len, int flag)
43 {
44     int num = 0;
45     if ( flag ) {
46         for ( int i = 0; i < len; i++ ) {
47             num = num * 10 + a[i];
48         }
49     } else {
50         for ( int i = len-1; i >= 0; i-- ) {
51             num = num * 10 + a[i];
52         }
53     }
54     return num;
55 }
56 
57 int max(int a[], int len)
58 {
59     int maxid = 0;
60     int i;
61     for ( i = 1; i < len; i++ ) {
62         if ( a[i] > a[maxid] ) {
63             maxid = i;
64         }
65     }
66     return maxid;
67 }
68 
69 void dd(int a[], int n)
70 {
71     a[0] = n / 100;
72     a[1] = n / 10 % 10;
73     a[2] = n % 10;
74 }

 

相关文章