当前位置: 代码迷 >> 综合 >> 实验7-1-12 组个最小数 (20分)
  详细解决方案

实验7-1-12 组个最小数 (20分)

热度:5   发布时间:2024-02-01 16:27:41.0

给定数字0-9各若干个。你可以以任意顺序排列这些数字,但必须全部使用。目标是使得最后得到的数尽可能小(注意0不能做首位)。例如:给定两个0,两个1,三个5,一个8,我们得到的最小的数就是10015558。

现给定数字,请编写程序输出能够组成的最小的数。

输入格式:

输入在一行中给出10个非负整数,顺序表示我们拥有数字0、数字1、……数字9的个数。整数间用一个空格分隔。10个数字的总个数不超过50,且至少拥有1个非0的数字。

输出格式:

在一行中输出能够组成的最小的数。

输入样例:

2 2 0 0 0 3 0 0 1 0

输出样例:

10015558

代码示例:

 

#include<stdio.h>
struct count{int number;int amount;
};int main()
{int a[50],max,j=1,k=0,tag,temp,sum=0,t=0;struct count b[10];for(int i=0;i<10;i++){scanf("%d",&b[i].amount);b[i].number = i;sum += b[i].amount;}while(sum!=0){for(int i=0;i<10;i++){if(b[i].amount != 0) {a[t] = i;t++;b[i].amount--;sum--;}}}for(int i=0;i<t-1;i++){while(j<t-i){if(a[k]>a[j]) {temp = a[j];a[j] = a[k];a[k] = temp;}j++;k++;}//每次都将最大值排到数组末尾j =1; k = 0;}//使用冒泡排序将数组进行从小到大排序;if(a[0]==0){for(int i=0;i<t;i++){if(a[i]!=0) {tag = i;break;}}temp = a[0];a[0] = a[tag];a[tag] = temp;}//判断数列是否首为0,若为0,向后遍历数组,找到第一个不为零的数(一定为最小)交换a[0]与该数据;for(int i=0;i<t;i++){printf("%d",a[i]);}//输出
}

 

  相关解决方案