话说这个哪错了??
查看原帖
话说这个哪错了??
175567
littlefrog楼主2021/2/3 10:21
#include <bits/stdc++.h>
#define int long long
using namespace std;
inline bool cmp1(int x, int y) {
    return x > y;
}

inline bool cmp2(int x, int y) {
    return x < y;
}

int nn[101], len;
inline int getmaxiumsort(int x) {
    // 获取由当前数字组成的最大排序

    len = 0;
    while (x != 0) {
        nn[++len] = x % 10;
        x /= 10;
    }

    sort(nn + 1, nn + len + 1, cmp1);

    int ret = 0;
    for (int i = 1; i <= len; ++i) {
        ret *= 10;
        ret += nn[i];
    }

    return ret;
}

inline int getminiumsort(int x) {
    // 获取由当前数字组成的最小排序

    len = 0;
    while (x != 0) {
        nn[++len] = x % 10;
        x /= 10;
    }

    sort(nn + 1, nn + len + 1, cmp2);

    int ret = 0;
    for (int i = 1; i <= len; ++i) {
        ret *= 10;
        ret += nn[i];
    }

    return ret;
}

int repeat[1000001], id;

inline int findnum(int x) { // 算了,我还是不用先 sort 再 log 二分的了,还不如直接顺序查找!!!
    for (int i = 0; i <= id; ++i) {
        if (repeat[i] == x) {
            return i;
        }
    }
    return -1;
}

signed main() {
    int x;
    while (cin >> x) {
        bool repeating; // 当前是否已经进入循环判定状态
        int beg, length; // 循环节的起始点和长度
        int begnum; // 循环节的起始数字

        int now; // 当前数字

        // 【Part - 1】 初始化
        now = x;
        repeating = false;

       // cout << getmaxiumsort(now) << endl;
       // cout << getminiumsort(now) << endl;

        // 【Part - 2】 判定循环节
        while (1) {
            // 【判定循环节 Part - 1】 生成下一步排列
            int now1 = getmaxiumsort(now);
            int now2 = getminiumsort(now);

            now = now1 - now2;

            /*cout << now1 << '-' << now2 << '=' << now << endl;
            for (int i = 0; i <= id; ++i) {
                cout << repeat[i] << ' ';
            }
            cout << endl;*/

            // 【判定循环节 Part - 2】 判断是否循环
            if (repeating == false) { // 不在循环判定状态,照常加入数组
                int k = findnum(now);
                //cout << k << ' ' << repeat[k] << ' ' << now << endl;
                if (k != -1) { // 当前数字之前出现过,表示目前可能出现循环,进入循环判定状态
                    repeating = true;
                    beg = k;
                    length = 1;
                    begnum = now;
                } else { // 继续加入数组,寻找循环节
                    repeat[id++] = now;
                }
            } else { // 在循环判定状态,不再把新的数加入数组,只是判定现在是否已经形成循环
                //cout << now << endl;
                if (now == repeat[beg + length]) { // 循环节未结束,继续累加长度
                    length++;
                } else if (now == begnum) { // 循环节已结束,立即退出循环,输出循环节
                    break ;
                } else if (now != repeat[beg +length] && now != begnum) { // 没有形成循环,推出循环判定状态,继续寻找其它循环节
                    repeating = false;
                }
            }

            //system("pause");
        }

        // 【Part - 3】 输出循环节
        // 输出以 beg 开始持续 length 个元素的循环节
        for (int i = beg; i < beg + length; ++i) {
            cout << repeat[i] << " ";
        }
        cout << endl;
    }
}
2021/2/3 10:21
加载中...