PAT 乙级练习题1023. 组个最小数 (20)

来源:互联网 发布:java 中map的put用法 编辑:程序博客网 时间:2024/05/18 13:07

给定数字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;  }