1 条题解

  • 0
    @ 2025-8-24 21:26:10

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar x_faraway_x
    毫无特色的 OI 入门选手

    搬运于2025-08-24 21:26:09,当前版本为作者最后更新于2017-01-21 21:50:48,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    比较繁琐的一道模拟题……

    这题就是把数拆分+排序,将组合成的最大值和最小值的差放进数组,如果发现重复就直接从重复的地方到尾输出即可结束

    ###这题有两个地方要格外注意

    1.要用long long!

    2.读入的n也可能成为循环的一部分,因此也要放入数组!

    具体见代码:

    #include <cstdio>
    #include <iostream>
    #include <algorithm>
    using namespace std;
    typedef long long LL; //该用long long的地方一定要用long long!
    int ind;
    LL a[100000], n;
    int main() {
        while(cin >> n) { //多组数据,用cin读入可以在文件结束时停止
            ind = 0;
            a[++ind] = n; //注意:读入的n也可能是循环的一部分!
            bool flag = true;
            while(flag) {
                LL b[20]={0}, n1 = 0, n2 = 0;
                int in = 0;
                while(n) { //拆分数
                    b[++in] = n % 10;
                    n /= 10;
                }
                sort(b+1, b+1+in); //排序
                for(int i = 1; i <= in; i++) n1 = n1*10+b[i]; //组合成最小数
                for(int i = in; i >= 1; i--) n2 = n2*10+b[i];  //组合成最大数
                n = n2-n1;
                for(int i = 1; flag && i <= ind; i++) //寻找
                    if(a[i] == n) { //若发现重复
                        flag = false; //可以跳出循环,结束搜索
                        for(int j = i; j <= ind; j++) //从重复的地方开始到数组结尾都是循环部分,输出即可
                            cout << a[j] << " ";
                    }
                a[++ind] = n; //将新组合成的数放进数组
            }
            puts("");
        }
        return 0;
    }
    //祝大家早日AC!
    
    • 1

    信息

    ID
    525
    时间
    1000ms
    内存
    125MiB
    难度
    3
    标签
    递交数
    0
    已通过
    0
    上传者