给定数字0-9各若干个。你可以以任意顺序排列这些数字,但必须全部使用。目标是使得最后得到的数尽可能小(注意0不能做首位)。例如:给定两个0,两个1,三个5,一个8,我们得到的最小的数就是10015558。
现给定数字,请编写程序输出能够组成的最小的数。
输入格式:
每个输入包含1个测试用例。每个测试用例在一行中给出10个非负整数,顺序表示我们拥有数字0、数字1、……数字9的个数。整数间用一个空格分隔。10个数字的总个数不超过50,且至少拥有1个非0的数字。
输出格式:
在一行中输出能够组成的最小的数。
输入样例:2 2 0 0 0 3 0 0 1 0输出样例:
10015558
#include<stdio.h>
int main()
{
int a[10],i;
for(i=0;i<10;i++)
{
scanf("%d",&a[i]);
}
if(a[0]==0)
{
for(i=1;i<10;i++)
{
for(int j=1;j<=a[i];j++)
{
printf("%d",i);
}
}
}
else
{
i=1;
while(a[i]==0)
{
i++;
}
printf("%d",i);
int m=i;
for(i=0;i<10;i++)
{
if(i==m)
{
for(int j=2;j<=a[i];j++)
{
printf("%d",i);
}
}
else
{
for(int j=1;j<=a[i];j++)
{
printf("%d",i);
}
}
}
}
return 0;
}
还是把代码贴上来。
#include<stdio.h>
#include<stdlib.h>
int cmp(const void *a,const void *b)
{
return(*(char *)a-*(char *)b);
}
int main()
{
char a[50],c;
int g[10]={0};
int i=0,n,m;
a[i]=getchar();
while(a[i]!='\n')
{
switch(c)
{
case '0': g[0]++;break;
case '1': g[1]++;break;
case '2': g[2]++;break;
case '3': g[3]++;break;
case '4': g[4]++;break;
case '5': g[5]++;break;
case '6': g[6]++;break;
case '7': g[7]++;break;
case '8': g[8]++;break;
case '9': g[9]++;break;
}
c=getchar();
if(c!=' ')
a[++i]=c;
}
n=i-1;
qsort(a,i,sizeof(a[0]),cmp);
if(a[0]!='0')
{
for(i=0;i<=n;i++)
{
printf("%c",a[i]);
}
}
else
{
printf("%c",a[g[0]]);//输出第一个最小一个非零数
for(i=0;i<g[0];i++)
{
printf("%c",a[i]);
}
for(i=g[0]+1;i<=n;i++)
{
printf("%c",a[i]);
}
}
return 0;
}