题解 P1532 【卡布列克圆舞曲 】

· · 题解

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

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

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

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!