【PAT甲级 - C++题解】1069 The Black Hole of Numbers

简介: 【PAT甲级 - C++题解】1069 The Black Hole of Numbers

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;
}
目录
相关文章
|
C++
【PAT甲级 - C++题解】1040 Longest Symmetric String
【PAT甲级 - C++题解】1040 Longest Symmetric String
39 0
|
算法 C++
【PAT甲级 - C++题解】1044 Shopping in Mars
【PAT甲级 - C++题解】1044 Shopping in Mars
62 0
|
C++
【PAT甲级 - C++题解】1117 Eddington Number
【PAT甲级 - C++题解】1117 Eddington Number
54 0
|
存储 C++ 容器
【PAT甲级 - C++题解】1057 Stack
【PAT甲级 - C++题解】1057 Stack
53 0
|
存储 C++
【PAT甲级 - C++题解】1055 The World‘s Richest
【PAT甲级 - C++题解】1055 The World‘s Richest
64 0
|
C++
【PAT甲级 - C++题解】1051 Pop Sequence
【PAT甲级 - C++题解】1051 Pop Sequence
58 0
|
人工智能 BI C++
【PAT甲级 - C++题解】1148 Werewolf - Simple Version
【PAT甲级 - C++题解】1148 Werewolf - Simple Version
108 0
|
3天前
|
C++
C++一分钟之-类与对象初步
【6月更文挑战第20天】C++的类是对象的蓝图,封装数据和操作。对象是类的实例。关注访问权限、构造析构函数的使用,以及内存管理(深拷贝VS浅拷贝)。示例展示了如何创建和使用`Point`类对象。通过实践和理解原理,掌握面向对象编程基础。
30 2
C++一分钟之-类与对象初步
|
4天前
|
存储 编译器 C++
|
4天前
|
C++
C++类和类模板——入门
C++类和类模板——入门
10 1