✍个人博客:https://blog.csdn.net/Newin2020?spm=1011.2415.3001.5343
📚专栏地址:PAT题解集合
📝原题地址:题目详情 - 1069 The Black Hole of Numbers (pintia.cn)
🔑中文翻译:数字黑洞
📣专栏定位:为想考甲级PAT的小伙伴整理常考算法题解,祝大家都能取得满分!
❤️如果有收获的话,欢迎点赞👍收藏📁,您的支持就是我创作的最大动力💪
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 until6174comes out as the difference. All the numbers must be printed as 4-digit numbers.Sample Input 1:
6767Sample Output 1:
7766 - 6677 = 1089 9810 - 0189 = 9621 9621 - 1269 = 8352 8532 - 2358 = 6174Sample Input 2:
2222Sample 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 ,并停止后续计算。
我们只需按照上述要求进行模拟操作即可,具体思路如下:
4 位数字用数组存起来,方便进行操作。4 位数字得到数字 a 。4 为数字得到数字 b 。b-a 的计算结果。#include
using namespace std;//进行一次计算操作
vector 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;
}