题目原文
【问题描述】
给定数字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
题目关键词提炼:
条件:
1、给定数字0-9各若干个。
2、可以以任意顺序排列这些数字,但必须全部使用。
目标:
使最后得到的数最小(注意0不能做首位)。
输入:
每个输入包含1个测试用例。
每个测试用例在一行中给出多个(<=50)数字(0~9之间),整数间用一个空格分隔。
至少拥有1个非0的数字(说明无论如何0都不可能在第一位,不会有单独的一个0这样的测试用例。)
思路分析
这题主要是看最小数长什么样。显然高位的数字越小越好。
输入的同时,数出0的个数。将数据从小到大排序。遍历数组,从第一个非0元素开始输出;在输出第一个非0元素后,将所有的0排在它的后面。
AC代码
#include <iostream>
#include<stdio.h>
#include<algorithm>
using namespace std;
int arr[60]={0};
int main()
{
int temp;
int len=0,cnt=0;
while(scanf("%d",&temp)!=EOF)
{
arr[len]=temp;
len++;
if(temp==0)
{
cnt++;//记录0的个数,同时,由此可知第一个非0元素的位置
}
}
sort(arr,arr+len);
for(int i=cnt;i<len;i++)
{
printf("%d",arr[i]);
if(i==cnt)//为了使所得结果才会最小,要在第一个非0元素的后面要插入所有的0。
{
for(int i=0;i<cnt;i++)
{
printf("0");
}
}
}
printf("\n");
return 0;
}