【问题描述】
给定数字0-9各若干个。你可以以任意顺序排列这些数字,但必须全部使用。目标是使得最后得到的数尽可能小(注意0不能做首位)。例如:给定两个0,两个1,三个5,一个8,我们得到的最小的数就是10015558。
现给定数字,请编写程序输出能够组成的最小的数。
【输入形式】
每个输入包含1个测试用例。每个测试用例在一行中给出多个(不超过50个)数字(0~9之间),整数间用一个空格分隔,且至少拥有1个非0的数字。
【输出形式】
在一行中输出能够组成的最小的数。
【样例输入】
2 2 0 0 0 3 0 0 1 0
【样例输出】
1000000223
#include<iostream>
using namespace std;
int main()
{
int a[50],n;
for(int i=0;i<50;i++) //定义a数组使其初值均为10
{
a[i]=10;
}
for(int i=0;i<50;i++) //重点:输入一行多个整数
{ //输入
cin>>n;
a[i]=n;
if(getchar()=='\n') break;
}
int b[10]={0,0,0,0,0,0,0,0,0,0}; //定义b数组存储各个数的个数
for(int x=0;x<50;x++)
{
if(a[x]==0) b[0]++;
else if(a[x]==1) b[1]++;
else if(a[x]==2) b[2]++;
else if(a[x]==3) b[3]++;
else if(a[x]==4) b[4]++;
else if(a[x]==5) b[5]++;
else if(a[x]==6) b[6]++;
else if(a[x]==7) b[7]++;
else if(a[x]==8) b[8]++;
else if(a[x]==9) b[9]++;
}
if(b[1]!=0) b[1]--,cout<<1; //先输出一个非零的最小数
else if(b[2]!=0) b[2]--,cout<<2;
else if(b[3]!=0) b[3]--,cout<<3;
else if(b[4]!=0) b[4]--,cout<<4;
else if(b[5]!=0) b[5]--,cout<<5;
else if(b[6]!=0) b[6]--,cout<<6;
else if(b[7]!=0) b[7]--,cout<<7;
else if(b[8]!=0) b[8]--,cout<<8;
else if(b[9]!=0) b[9]--,cout<<9;
for(int a=0;a<10;a++) //从零开始输出,组成最小数
{
for(int c=0;c<b[a];c++)
{
cout<<a;
}
}
return 0;
}
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int main()
{
string s;
getline(cin,s); //以字符串形式输入
int number=0,len=s.length();
for(int i=0; i<len; i++) //计算字符串中数字多少
{
if(s[i]!=' ') number++;
}
int a[number],last=0;
for(int i=0; i<number; i++) //以a【number】存储数字
{
for(int j=last; j<len; j++)
{
if(s[j]!=' ')
{
a[i]=s[j]-48;
last=j+1;
break;
}
}
}
// for(int i=0; i<number; i++) //检验
// {
// cout<<a[i];
// }
// cout<<endl;
sort(a,a+number); //进行升序排列
if(a[0]==0) //将第一个非零数字与第一个零交换
{
for(int i=0; i<number; i++)
{
if(a[i]!=a[0])
{
a[0]=a[i];
a[i]=0;
break;
}
}
}
for(int i=0; i<number; i++)
{
cout<<a[i];
}
return 0;
}