1 条题解
-
0
自动搬运
来自洛谷,原作者为

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
- 上传者