返回 课程
信奥AC之路-3级
0% 完成
0/0 步骤
-
第一课:数组基础4 主题|小节
-
第二课:数组基础二6 主题|小节
-
第三课:数组基础三6 主题|小节
-
第四课:数组基础四7 主题|小节
-
第五课:数组基础五5 主题|小节
-
第六课:数组用于统计,去重,排序5 主题|小节
-
第七课:冒泡排序6 主题|小节
-
第八课:数组连续性元素6 主题|小节
-
第九课:数组综合一7 主题|小节
-
第十课:字符数组7 主题|小节
-
第十一课:字符数组基础应用5 主题|小节
-
第十二课:字符数组基础应用二6 主题|小节
-
第十三课:字符数组进阶6 主题|小节
-
第十四课:字符串进阶二6 主题|小节
-
第十五课:字符串(STL)9 主题|小节
-
第十六课:字符串基础6 主题|小节
-
第十七课:字符串函数6 主题|小节
-
第十八课:字符串函数二4 主题|小节
-
第十九课:sort函数7 主题|小节
-
第二十课:字符串进阶7 主题|小节
-
第二十一课:字符串进阶二6 主题|小节
-
第二十二课:进制转换--十进制转其他进制5 主题|小节
-
第二十三课:进制转换--其他进制转十进制5 主题|小节
-
第二十四课:二进制,八进制,十六进制转换5 主题|小节
-
第二十五课:数据编码基础6 主题|小节
-
第二十六课:位运算基础6 主题|小节
课 进展
0% 完成
“接下来,让我们学习一个有趣的应用——如何重新排列数字的各位,得到最小的数!”我继续说道。
19.2.1 重新排列获得最小数
题目描述: 现在有一个30位以内的自然数,你可以将组成这个数的各位数字重新排列,得到一个数值为最小的新数,但新数的位数保持不变。请编程打印出重新排列后的新数。(如:231重新排序后位数不变的最小数是123,而23105重新排序后位数不变的最小数是10235)
输入格式: 一个整数(位数≤30位)。
输出格式: 重新排列后最小的新数。
样例:
- 输入:382 输出:238
- 输入:231050 输出:100235
#include<bits/stdc++.h>
using namespace std;
int main(){
string s;
cin >> s; // 以字符串形式读入,避免大数问题
// 对所有字符进行升序排序
sort(s.begin(), s.end());
// 处理前导零:找到第一个非零字符的位置
int k = 0;
while(s != "0" && s[k] == '0') k++;
// 将第一个非零字符与首位交换,避免前导零
swap(s[0], s[k]);
cout << s;
return 0;
}
算法解析:
- 使用字符串读入,避免30位大数的溢出问题
- 对字符串进行升序排序,得到字典序最小的排列
- 特殊处理:如果首位是’0’,需要找到第一个非’0’字符与之交换
- 这样既保证了数值最小,又避免了前导零的问题