✍个人博客: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 until6174
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
,并停止后续计算。
我们只需按照上述要求进行模拟操作即可,具体思路如下:
4
位数字用数组存起来,方便进行操作。4
位数字得到数字 a
。4
为数字得到数字 b
。b-a
的计算结果。#include
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;
}