GESP2023年9月认证C++二级( 第三部分编程题(2)数字黑洞)

发布于:2025-06-09 ⋅ 阅读:(17) ⋅ 点赞:(0)

参考程序:

#include <iostream>  // 引入输入输出库
using namespace std;

int main() {
    int n = 0;
    cin >> n;  // 读入一个三位数

    // 无限循环,直到结果为 495
    for (int t = 0; ; t++) {  // t 是操作次数计数器
        if (n == 495) {
            cout << t << endl;  // 输出次数后退出程序
            break;
        }

        // 拆分三位数的各位:百位、十位、个位
        int m0 = n % 10;         // 个位
        int m1 = n / 10 % 10;    // 十位
        int m2 = n / 100;        // 百位

        int tmax = 0, tmin = 0;

        // 构造最大值和最小值
        // 通过比较三个数字的大小关系来进行全排列构造
        if (m0 >= m1 && m1 >= m2) {
            tmax = m0 * 100 + m1 * 10 + m2;
            tmin = m2 * 100 + m1 * 10 + m0;
        } else if (m0 >= m2 && m2 >= m1) {
            tmax = m0 * 100 + m2 * 10 + m1;
            tmin = m1 * 100 + m2 * 10 + m0;
        } else if (m1 >= m0 && m0 >= m2) {
            tmax = m1 * 100 + m0 * 10 + m2;
            tmin = m2 * 100 + m0 * 10 + m1;
        } else if (m1 >= m2 && m2 >= m0) {
            tmax = m1 * 100 + m2 * 10 + m0;
            tmin = m0 * 100 + m2 * 10 + m1;
        } else if (m2 >= m0 && m0 >= m1) {
            tmax = m2 * 100 + m0 * 10 + m1;
            tmin = m1 * 100 + m0 * 10 + m2;
        } else {  // m2 >= m1 && m1 >= m0
            tmax = m2 * 100 + m1 * 10 + m0;
            tmin = m0 * 100 + m1 * 10 + m2;
        }

        // 更新 n 为差值
        n = tmax - tmin;
    }

    return 0;
}

参考程序(sort+vector):

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int main() {
    int n, t = 0;
    cin >> n;

    while (n != 495) {
        vector<int> digits = {n / 100, (n / 10) % 10, n % 10};
        sort(digits.begin(), digits.end());
        int tmin = digits[0] * 100 + digits[1] * 10 + digits[2];
        int tmax = digits[2] * 100 + digits[1] * 10 + digits[0];
        n = tmax - tmin;
        t++;
    }

    cout << t << endl;
    return 0;
}


网站公告

今日签到

点亮在社区的每一天
去签到