题目描述
给定数字 0...9 各若干个,总共十个数字。你可以以任意顺序排列这些数字,但必须全部使用。
目标是使得最后得到的数尽可能小(注意 0 不能做首位)。
例如:给定三个 1,三个 0,三个 5,一个 8,我们得到的最小的数就是 1000115558。
现给定数字,请编写程序输出能够组成的最小的数。
输入描述:
输入只有一行。
在一行中给出 10 个 0...9 之间的整数,每个数字间用空格隔开。
给定数字中至少有 1 个非 0 的数字。
输出描述:
在一行中输出能够组成的最小的数。
样例1
输入
1 1 1 0 0 0 5 5 5 8
输出
1000115558
方法一:短代码,用for循环
#include <bits/stdc++.h>
int a[10005],cnt,i;
int main(){
while(~scanf("%d", &a[cnt]))++cnt;
for(std::sort(a,a+cnt),i;i<cnt;a[i]?std::swap(a[i],a[0]),i=cnt:0,++i);
for(i=0;i<cnt;printf("%d",a[i]),++i);
}
方法二:长代码,多重if判断
#include<bits/stdc++.h>
using namespace std;
int main(){
int s, a[11];
int z=0,o=0, t=0, th=0, f=0, fi=0, si=0, se=0, e=0, n=0;
for(int i = 0;i<10;i++){
scanf("%d", &s);
if(s == 0){
z++;
}else if(s == 1){
o++;
}else if(s == 2){
t++;
}else if(s == 3){
th++;
}else if(s == 4){
f++;
}else if(s == 5){
fi++;
}else if(s == 6){
si++;
}else if(s == 7){
se++;
}else if(s == 8){
e++;
}else if(s == 9){
n++;
}
}
if(o>0){
printf("1");
}
if(z>0){
for(int j = 0;j<z;j++){
printf("0");
}
}
if(o>0){
for(int j = 0;j<o-1;j++){
printf("1");
}
}
if(t>0){
for(int j = 0;j<t;j++){
printf("2");
}
}
if(th>0){
for(int j = 0;j<th;j++){
printf("3");
}
}
if(f>0){
for(int j = 0;j<f;j++){
printf("4");
}
}
if(fi>0){
for(int j = 0;j<fi;j++){
printf("5");
}
}
if(si>0){
for(int j = 0;j<si;j++){
printf("6");
}
}
if(se>0){
for(int j = 0;j<se;j++){
printf("7");
}
}
if(e>0){
for(int j = 0;j<e;j++){
printf("8");
}
}
if(n>0){
for(int j = 0;j<n;j++){
printf("9");
}
}
return 0;
}
经过测试,两个方法的时间和空间基本相同,根据情况自行选择吧,886~