题解 P1532 【卡布列克圆舞曲 】
x_faraway_x · · 题解
比较繁琐的一道模拟题……
这题就是把数拆分+排序,将组合成的最大值和最小值的差放进数组,如果发现重复就直接从重复的地方到尾输出即可结束
这题有两个地方要格外注意
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!