1069 The Black Hole of Numbers(20 分)
For any 4-digit integer except the ones with all the digits being the same, if we sort the digits in non-increasing order first, and then in non-decreasing order, a new number can be obtained by taking the second number from the first one. Repeat in this manner we will soon end up at the number 6174
-- the black hole of 4-digit numbers. This number is named Kaprekar Constant.
For example, start from 6767
, we'll get:
7766 - 6677 = 1089
9810 - 0189 = 9621
9621 - 1269 = 8352
8532 - 2358 = 6174
7641 - 1467 = 6174
... ...
Given any 4-digit number, you are supposed to illustrate the way it gets into the black hole.
Input Specification:
Each input file contains one test case which gives a positive integer N in the range (0,104).
Output Specification:
If all the 4 digits of N are the same, print in one line the equation N - N = 0000
. Else print each step of calculation in a line until 6174
comes out as the difference. All the numbers must be printed as 4-digit numbers.
Sample Input 1:
6767
Sample Output 1:
7766 - 6677 = 1089
9810 - 0189 = 9621
9621 - 1269 = 8352
8532 - 2358 = 6174
Sample Input 2:
2222
Sample Output 2:
2222 - 2222 = 0000
1 #include <iostream> 2 #include <algorithm> 3 #include <cstdio> 4 #include <cstring> 5 #include <string> 6 #include <map> 7 #include <stack> 8 #include <vector> 9 #include <queue> 10 #include <set> 11 #define LL long long 12 #define INF 0x3f3f3f3f 13 using namespace std; 14 const int MAX = 1e5 + 10; 15 16 int n, A[10], ans_min, ans_max, cnt; 17 18 int my_pow(int x, int n) 19 { 20 int ans = 1; 21 while (n) 22 { 23 if (n & 1) ans *= x; 24 x *= x; 25 n >>= 1; 26 } 27 return ans; 28 } 29 30 int main() 31 { 32 // freopen("Date1.txt", "r", stdin); 33 scanf("%d", &n); 34 if (n == 6174) 35 { 36 printf("7641 - 1467 = 6174\n"); 37 return 0; 38 } 39 while (1) 40 { 41 if (n == 6174) return 0; 42 ans_max = ans_min = cnt = 0; 43 while (n) 44 { 45 A[cnt ++] = n % 10; 46 n /= 10; 47 } 48 sort(A, A + 4, less<int>()); 49 for (int i = 0; i < 4; ++ i) 50 ans_max += A[i] * my_pow(10, i); 51 sort(A, A + 4, greater<int>()); 52 for (int i = 0; i < 4; ++ i) 53 ans_min += A[i] * my_pow(10, i); 54 55 if (ans_min == ans_max) 56 { 57 printf("%04d - %04d = 0000\n", ans_max, ans_min); 58 return 0; 59 } 60 n = ans_max - ans_min; 61 printf("%04d - %04d = %04d\n", ans_max, ans_min, n); 62 } 63 return 0; 64 }