题目描述: 现在有一个 18 位以内的自然数,你可以将组成这个数的各位数字重新排列,得到一个数值为最小的新数,但新数的位数保持不变。 请编程打印出重新排列后的新数。(如:231 重新排序后位数不变的最小数是 123 ,而 23105 重新排序后位数不变的最小数是 10235) 输入: 一个整数(位数 ≤18 位)。 输出: 重新排列后最小的新数。 样例输入: 382 样例输出: 238 样例输入: 231050 样例输出: 100235#include<bits/stdc++.h> using namespace std; int a1[10],b1[10],t=1; int main() { string a,b; cin>>a; for(int i=0;i<a.length();i++) { a1[a[i]]=a[i];b1[a[i]]++; } for(int i=1;i<=9;i++) { if(b1[i]!=0) { b[0]=i; //cout<<i; b1[i]--; break; } } for(int i1=0;i1<a.length();i1++) { for(int i=0;i<=9;i++) { if(b1[i]!=0) { b[i]=i; //cout<<i; b1[i]--; } } } for(int i=0;i<a.length();i++) { cout<<b[i]; } }
时间: 2024-04-18 11:27:25 浏览: 244
一年级数学下册第3单元生活中的数3.6做个百数表表格式教案北师大版
这段代码的目标是找到给定整数重新排序的最小数。代码首先读取一个整数a,并使用两个数组a1和b1来记录数字的出现情况。然后,通过遍历字符串a,将每个数字分别记录在数组a1中,并统计每个数字出现的次数。接下来,从1到9遍历数组b1,找到第一个出现次数不为0的数字,将其添加到结果字符串b的第一个位置,并将b1中对应位置的计数减一。然后,再次遍历字符串a的每个位置,从0到9遍历数组b1,找到第一个出现次数不为0的数字,并将其添加到结果字符串b的对应位置,并将b1中对应位置的计数减一。最后,输出结果字符串b。
虽然该代码可以输出重新排列后的最小数,但是它并不是一个有效且高效的解决方案。为了找到重新排列后的最小数,我们可以将整数转换为字符串,并对字符串进行排序。以下是更有效且简洁的代码:
```cpp
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
int main() {
string num;
cin >> num;
sort(num.begin(), num.end());
int i = 0;
while (num[i] == '0') {
i++;
}
swap(num[i], num[0]);
cout << num << endl;
return 0;
}
```
这段代码首先读取一个整数num,并将其转换为字符串。然后,使用sort函数对字符串进行排序,得到重新排列后的最小数。在排序后的字符串中找到第一个非零字符,并将其与第一个字符交换位置,以确保最小数的最高位不为零。最后,输出重新排列后的最小数。
这个解决方案更加简洁和高效,可以正确地输出重新排列后的最小数。
阅读全文