首页 > 试题广场 >

组个最小数 (20)

[编程题]组个最小数 (20)
  • 热度指数:19788 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
给定数字0-9各若干个。你可以以任意顺序排列这些数字,但必须全部使用。目标是使得最后得到的数尽可能小(注意0不能做首位)。例如:

给定两个0,两个1,三个5,一个8,我们得到的最小的数就是10015558。



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

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


输出描述:
在一行中输出能够组成的最小的数。
示例1

输入

2 2 0 0 0 3 0 0 1 0

输出

10015558

import java.util.Scanner; public class Main{ public static void main(String[] args){
        Scanner scanner = new Scanner(System.in);
        String[] input = scanner.nextLine().split(" ");
        StringBuilder stringBuilder = new StringBuilder();  for (int i = 0; i < 10; i++){  if (Integer.valueOf(input[i]) != 0){  for (int num = Integer.valueOf(input[i]); num>0;num--){
                    stringBuilder.append(i);
                }
            }
        }  if (stringBuilder.toString().length() == 0){  return;
        }  if (stringBuilder.toString().length() == 1){
            System.out.println(stringBuilder.toString());  return;
        }  if (Integer.valueOf(input[0]) == 0) {
            System.out.println(stringBuilder.toString());  return;
        }else {
            String zero = "";  for (int j = 0; j < Integer.valueOf(input[0]); j++)
                zero = zero + "0";
            stringBuilder.insert(Integer.valueOf(input[0])+1,zero);
            stringBuilder.delete(0,Integer.valueOf(input[0]));
            System.out.println(stringBuilder);  return;
        }
    }
}


编辑于 2019-06-27 21:44:40 回复(0)
更多回答
#include<iostream>
using namespace std;
int main()
{
	int a[10];
	for (int i = 0;i < 10;i++)
		cin >> a[i];
	for (int i = 1;i < 10;i++)
		if (a[i] != 0)
		{
			cout << i;
			a[i]--;
			break;
		}
	for (int i = 0;i < 10;i++)
		while (a[i] != 0)
		{
			cout << i;
			a[i]--;
		}
	return 0;
}

编辑于 2016-07-30 03:40:40 回复(2)
#include <stdio.h>
#include <stdlib.h>
//组个最小数
int main()
 {
int num[10];
int i;
for( i = 0 ; i < 10 ; i++ )
        {
scanf("%d",&num[i]);
}
for( i = 1  ; i < 10 ; )
        {
if( num[i] > 0 )
        {
printf("%d",i);
num[i]--;
i = 0;
}
else
        {
i++;
}
}
return 0;
}

发表于 2015-10-29 10:43:03 回复(3)
import java.util.Scanner;
public class Main{
    public static void main(String[] args){
        Scanner s = new Scanner(System.in);
        int[] a = new int[10];
        for(int i = 0;i <a.length;i++){
            a[i] = s.nextInt();
        }
        int j = 1;
        for(;j<a.length;j++) {
            if (a[j] != 0) {
                System.out.print(j);
                a[j] = a[j]-1;
                break;
            }
        }
        for(int k = 0;k <10;k++){
            for(int m = 0;m<a[k];m++){
                System.out.print(k);
            }
        }
    }
}
发表于 2020-03-23 22:38:35 回复(0)
public class Main{
    public static void main(String[] args){
        Scanner input =new Scanner(System.in);
        int[] num=new int[10];
        for(int i=0;i<10;i++){
            num[i]=input.nextInt();
        }
        StringBuilder number=new StringBuilder("");
        if(num[0]==0){//如果不含零,可直接拼接
            for(int i=1;i<10;i++){
                while(num[i]!=0){
                    number.append(i);
                    num[i]--;
                }
            }
        }else{//如果含零,则需要找出最小的非零数放在首位,然后进行拼接
            int pos=1;//定义第一个存在的非0数
            while(num[pos]==0){
                pos++;//找出其位置
            }
            number.append(pos);
            num[pos]--;
            for(int i=0;i<10;i++){
                while(num[i]!=0){
                    number.append(i);
                    num[i]--;
                }
            }
        }
        System.out.print(number);
    }
}

发表于 2021-02-20 11:35:12 回复(1)
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<string>
#include<cstdlib>
#include<stack>
#include<queue>
#include<algorithm>//其实用不着那么多头程序
using namespace std;
int ans;
int main()
{
int a[10];
scanf("%d%d%d%d%d%d%d%d%d%d",&a[0],&a[1],&a[2],&a[3],&a[4],&a[5],&a[6],&a[7],&a[8],&a[9]);
for(int i=1;i<=9;++i)
{
if(a[i]&&!ans)
{
cout<<i;
for(int j=1;j<=a[0];++j)
{
cout<<0;
}
for(int j=2;j<=a[i];++j)
{
cout<<i;
}
ans=!ans;
continue;
}
for(int j=1;j<=a[i];++j)
{
cout<<i;
}
}
return 0;
 }
编辑于 2019-07-25 17:18:49 回复(0)
#include <iostream>

using namespace std;

int main()
{
    int a[11];
    int x;
    int i;
    for(i=0;i<10;i++)
    {
        cin>>x;
        a[i]=x;
    }
    for(i=1;i<10;i++)
    {
        if(a[i]!=0)
        {
            cout<<i;
            a[i]-=1;
            break;
        }
    }
    for(i=0;i<10;i++)
    {
        for(int j=0;j<a[i];j++)
        {
            cout<<i;
        }
    }
}

发表于 2019-07-14 12:55:59 回复(0)
import java.util.*;
public class Main{
    public static void main(String []args){
          Scanner in=new Scanner(System.in);
          int num[]=new int[10];
          for(int i=0;i<10;i++){
               num[i]=in.nextInt();
          }
        for(int i=1;i<10;i++){
            if(num[i]!=0){
                System.out.print(i);
                num[i]--;
                break;
            }
        }
        while(num[0]!=0){
            System.out.print(0);
            num[0]--;
        }
         for(int i=1;i<10;i++){
                while(num[i]!=0){
                    System.out.print(i);
                    num[i]--;
                }
            }
            
        }
    }

发表于 2019-04-28 14:19:57 回复(1)
#include<cstdio>
int main()
{
    int num[10]={0};
    for(int i=0;i<10;++i)
    {
        scanf("%d",&num[i]);
    }
    //输出首位
    for(int i=1;i<10;++i)
    {
        if(num[i]!=0)
        {
            printf("%d",i);
            num[i]--;
            break;
        }
    
     //输出剩下几位
     for(int i=0;i<10;++i)
     {
         if(num[i]!=0)
         {
             while(num[i]!=0)
             {
                 printf("%d",i);
                 num[i]--;
             }
         }
      } 
    return 0;
}
发表于 2019-04-18 14:33:33 回复(0)
#include <iostream>
#include <string>
using namespace std;
int main()
{
    int *n = new int[10];
    string min;
    for (int i = 0; i < 10; i++)
    {
        cin >> n[i];
        for (int j = 0; j < n[i]; j++)
            min += to_string(i);
    }
    if (n[0] != 0)
    {
        min[0] = min[n[0]];
        min[n[0]] = '0';
    }
    cout << min << endl;
    return 0;
}
发表于 2019-03-05 17:13:15 回复(0)
//把所有0都插入第二个位置上,其他按顺序输出就可以了
import java.util.Scanner;
import java.util.ArrayList;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while (sc.hasNext()) {
            ArrayList<Integer> al = new ArrayList<>();
            int[] nums = new int[10];
            for (int i = 0; i < 10; i++) {
                nums[i] = sc.nextInt();
            }
            for (int i = 1; i < 10; i++) {
                for (int j = 0; j < nums[i]; j++) {
                    al.add(i);
                }
            }
            System.out.print(al.get(0));
            for (int i = 0; i < nums[0]; i++) {
                System.out.print(0);
            }
            for (int i = 1; i < al.size(); i++) {
                System.out.print(al.get(i));
            }
            System.out.println();
        }
    }
}

发表于 2018-09-29 15:57:21 回复(0)

已经按从小到大开始加入到数组中了,所以只要在查找过程中找到一个非零数弹出插入到第一位即为最小数

while True:
    try:
        digitList = list(map(int,input().split()))
        numList = []
        getFirstNum = False
        for i in range(10):
            for j in range(digitList[i]):
                numList.append(i)
                if not getFirstNum and i != 0:
                    numList.insert(0,numList.pop(-1))
                    getFirstNum = True
        print("".join(map(str,numList)))
    except Exception:
        break
编辑于 2018-09-20 23:59:50 回复(2)
//by wujie from zhuoyue honor college of hangzhou dianzi university 
#include<iostream>
#include<vector>
using namespace std;

int main()
{
    int a;
    while(cin>>a)
    {
        vector<int> b;
        //对输入的第一个数字进行处理 
        for(int i = 0;i<a;i++)
        {
            b.push_back(0);//第一个是0位 
        }
        //对剩下的九个数字进行处理 
        int count = 1;//数字位
        for(int i = 0;i<9;i++)
        {
            cin>>a;
            for(int j=0;j<a;j++)
            {
                b.push_back(count);
            }
            count++;//数字位递增     
        }
        //因为vector里面是按顺序由小到大的所以我们只需要找到第一个不为0的输出,再从头到尾输出vector即可 
        int length = b.size();
        int flag = 0;//找到第一个不是0数的位置 
        for(int i=0;i<length;i++)
        {    
            if(b[i]!=0)
            {
                cout<<b[i];
                flag = i;
                break;
            }
        }
        for(int i=0;i<length;i++)
        {
            
            //跳过已经输出的那位 
            if(i!=flag)
            {
                cout<<b[i];
            }
        }
        cout<<endl;            
    }    
    return 0;


编辑于 2018-08-13 14:05:01 回复(0)
思路:排序交换第一个不是0的数即可。
#include <iostream>
#include <algorithm>
#include <string>
#include <fstream>
using namespace std;

#ifndef debug
ifstream ifile("case.txt");
#define cin ifile
#endif

int main(){
    int num;
    string rlt;
    for(int i=0; i<10; i++){
        cin >> num;
        string tmp(num, '0' + i);
        rlt += tmp;
    }
    sort(rlt.begin(), rlt.end());
    for (int i = 0; i < rlt.size(); i++) {
        if (rlt[i] != '0') {
            swap(rlt[0], rlt[i]);
            break;
        }
    }
    cout << rlt << endl;
    system("pause");
}



编辑于 2018-09-04 10:56:35 回复(1)
 #include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
    int  no[10];
    int m=0,n,i,j,k=0,a[10]={0};
    for(i=0;i<10;i++)
    scanf("%d",&no[i]);
    for(i=0;i<10;i++)
        a[i]=no[i];
    for(i=0;i<10;i++)
    {
        if(a[i]!=0&&i!=0&&k==0)
        {
            no[0]=i;
            printf("%d",no[0]);
            a[i]--;
            k++;
        }
    }
    for(i=0;i<10;i++)
    {
        if(a[i]!=0)
        {
            m++;
            n=m;
            no[n]=i;
            for(j=0;j<a[i];j++)
            printf("%d",no[n]);
        }
    }
    return 0;
}


发表于 2018-05-15 14:25:42 回复(0)
package smallNum;

import java.util.Scanner;

/**
 * 
 * <h3><b> 输入描述: </b></h3>
 * 每个输入包含1个测试用例。每个测试用例在一行中给出10个非负整数,顺序表示我们拥有数字0、数字1、……数字9的个数。整数间用一个空
 * 
 * 格分隔。10个数字的总个数不超过50,且至少拥有1个非0的数字。
 * 
 * <h3><b> 输出描述: </b></h3> 在一行中输出能够组成的最小的数。
 * <h3><b> 输入 </b></h3>
 * 
 * <pre>
 * 2 2 0 0 0 3 0 0 1 0
 * </pre>
 * 
 * <h3><b> 输出 </b></h3>
 * 
 * <pre>
 * 10015558
 * </pre>
 * 
 * @author hewhys
 *
 */
public class Main {

    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        int[] i = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
        StringBuffer sb = new StringBuffer();
        // input
        for (int j = 0; j < i.length; j++) {
            i[j] = scan.nextInt();
        }
        // output the first not-zero num to StringBuffer
        for (int j = 1; j < i.length; j++) {
            if (i[j] > 0) {
                sb.append(j);
                i[j]--;    // delete the output one
                break;
            }
        }
        // output all the num to StringBuffer
        for (int j = 0; j < i.length; j++) {
            if (i[j] > 0) {
                for (int j2 = 0; j2 < i[j]; j2++) {
                    sb.append(j);
                }
            }
        }          
        // output the result
        System.out.println(sb.toString());
        scan.close();
    }

}

发表于 2018-05-10 20:23:38 回复(0)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iostream>

using namespace std;

#define FOR(i,n) for(i=0;i<n;i++)

int main()
{
    int i, count[10], j = 0, length = 0, k;
    char str[50];
    cin.sync_with_stdio(false);
    FOR(i, 10)
    {
        cin >> count[i];
        length += count[i];
        if (count[i] && i && !j)
        {
            str[j++] = '0' + i;
            count[i]--;
        }

    }
    FOR(i, 10)
        FOR(k, count[i])
            str[j++] = '0' + i;
    FOR(i, j)
        cout << str[i];


    return 0;
}
发表于 2018-04-21 22:23:34 回复(0)
//比较直观的方法
import java.util.*;
public class Main{
    public static void main(String[] args){
        List<Integer> data = newArrayList();
        Scanner sc = new Scanner(System.in);
        while(sc.hasNext()){
            data.add(sc.nextInt());
        }
        StringBuilder sb = new StringBuilder();
        boolean hasZero = data.get(0)!=0;
        for(inti = 1;i<10;i++){
            if(hasZero&&data.get(i)!=0){//遇到首位为0的状况则在下一位的第一位后面添0则为最小。
                appendVal(sb,i,1);
                for(intk = 0;k<data.get(0);k++){
                   sb.append(0);
               }
                hasZero = false;
            appendVal(sb,i,data.get(i)-1);
            }else{
            appendVal(sb,i,data.get(i));
            }
        }
        System.out.println(sb.toString());
    }
     //填入对应位上的数值
    public static void appendVal(StringBuilder sb,int val,int count){
        if(sb!=null){
            for(inti = 0;i<count;i++){
                sb.append(val);
            }
        }
    }
 
}
发表于 2018-03-20 15:17:44 回复(0)
#include <iostream>
using namespace std;
int main(){
    int a[10];
    for(int i=0;i<10;i++)
        cin>>a[i];
    for(int i=1;i<10;i++){
        if(a[i]){
            cout<<i;
            a[i]--;
            break;
        }
    }
    for(int i=0;i<10;i++){
        while(a[i]--)
            cout<<i;
    }
    return 0;
}

编辑于 2018-01-26 20:45:32 回复(0)
import java.util.Scanner;

public class Main23 {
public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
    int[] a = new int[10];
     a[0] = sc.nextInt();
     a[1] = sc.nextInt();
     a[2] = sc.nextInt();
     a[3] = sc.nextInt();
     a[4] = sc.nextInt();
     a[5] = sc.nextInt();
     a[6] = sc.nextInt();
     a[7] = sc.nextInt();
     a[8] = sc.nextInt();
     a[9] = sc.nextInt();
    int length=a[0]+a[1]+a[2]+a[3]+a[4]+a[5]+a[6]+a[7]+a[8]+a[9];
    String b="";
    if(a[0]!=0){
        for(int i=1;i<=9;i++){
            if(a[i]!=0){
                b=i+"";
                a[i]=a[i]-1;
                break;
            }
        }
        
    }
        for(int i=0;i<=9;i++){
            while(a[i]!=0){
                b+=i+"";
                a[i]=a[i]-1;
            }
            
        }
    
    
    System.out.println(b);
}
}
判断好有0的时候 最高位的放置就行 其他按升序排列就行

发表于 2017-11-20 11:28:11 回复(0)
可以AC,可以A
import java.util.ArrayList;
import java.util.Scanner;

public class Main {     @SuppressWarnings("resource")     public static void main(String[] args) {         Scanner in = new Scanner(System.in);         int[] intArray = new int[10];// 这里面的10个数字,代表0-9分别有多少个         for (int i = 0; i < intArray.length; i++) {             intArray[i] = in.nextInt();         }         ArrayList<Integer> arrayList = new ArrayList<Integer>();// 建立一个集合,存放所有的数字         int i = 0;// 代表现在数到第几个数字上去了         while (i < 10) {             for (int j = 0; j < intArray[i]; j++) {                 arrayList.add(i);// 只要在这个循环内,就给我往上加             }             i++;         }         /*          * for (Integer integer : arrayList) { System.out.println(integer); }          */         Object[] array = arrayList.toArray();         for (int j = 0; j < array.length; j++) {             if (array[j] != array[0]&&Integer.valueOf(array[0].toString())==0) {                 Object t = array[j];                 array[j] = array[0];                 array[0] = t;                 break;             }         }         for (int j = 0; j < array.length; j++) {             System.out.print(array[j]);         }     }
}

发表于 2017-09-22 13:38:10 回复(0)

问题信息

难度:
150条回答 19501浏览

热门推荐

通过挑战的用户