1069 The Black Hole of Numbers
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
题意
给定一个 4 位的数字,对其每位数字进行降序操作得到数字 a ,对其每位数字进行升序操作得到数字 b ,将 a-b 得到数字 c ,如果 c 等于 6174 ,那么后续进行上述操作得到数字会一直会 6174 ,这个数字就被称为数字黑洞。
现在需要我们写出上述的计算过程,例如给定一个数字 6767 ,其计算过程如下:
7766 - 6677 = 1089 9810 - 0189 = 9621 9621 - 1269 = 8352 8532 - 2358 = 6174
另外,如果 a-b 等于 0 则输出 a - b = 0000 ,并停止后续计算。
思路
我们只需按照上述要求进行模拟操作即可,具体思路如下:
1.将得到的 4 位数字用数组存起来,方便进行操作。
2.对数组按照升序排序,并将数组中的数字还原成 4 位数字得到数字 a 。
3.对排序后的数组反向还原出 4 为数字得到数字 b 。
4.输出 b-a 的计算结果。
代码
#include<bits/stdc++.h> using namespace std; //进行一次计算操作 vector<int> get(int n) { int nums[4]; //将4位数字放入数组中 for (int i = 0; i < 4; i++) nums[i] = n % 10, n /= 10; //获得升序数字 sort(nums, nums + 4); int a = 0; for (int i = 0; i < 4; i++) a = a * 10 + nums[i]; //获得降序数字 int b = 0; for (int i = 3; i >= 0; i--) b = b * 10 + nums[i]; return { b,a }; } int main() { int n; cin >> n; do { auto t = get(n); //打印计算结果 printf("%04d - %04d = %04d\n", t[0], t[1], t[0] - t[1]); //更新当前数值 n = t[0] - t[1]; } while (n && n != 6174); return 0; }