实验7-1-12 组个最小数 (20 分)/*简洁易懂版*/

本文介绍了一个算法,用于根据给定的数字0-9的数量,生成可能的最小数字。通过合理排序和输出数字,确保生成的数字是最小的,同时考虑到了0不能作为首位的特殊情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

实验7-1-12 组个最小数 (20 分)
给定数字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>
int main () { /*本题主要思想即先输出出一个最小的非0首位数字,然后0-9顺序输出即可*/ 
	int i,count[10];
	for(i=0;i<10;i++) { /*i即数字0-9,然后用count[i]数组存储i的个数*/
		scanf("%d",&count[i]); 
	}
	for(i=1;i<10;i++) {	/*先输出一个非0的数字最小数字*/ 
		if(count[i]!=0){	/*这个最小数字i首先要存在,即count不等于0*/ 
			printf("%d",i);
			count[i]--;	/*输出了这个数的存放个数减1*/ 
			break;} /*当找到最小的首位数时就退出循环*/ 
	} 
	for(i=0;i<10;i++) { /*然后有0-9循环输出这些数*/ 
		while(count[i]!=0){	/*输出的数首先要存在然后每输出一次存放个数减1,直到为0退出循环*/ 
			printf("%d",i);
			count[i]--;
		}
	}
	return 0;/*zcs*/
} 
1、实现的基本原理: 利用单词描述工具(文法、自动机及它们之间的关系)进行单词解析。 2、实验内容 (1)掌握从源程序文件中读取有效字符的方法和产生源程序的内部表示文件的方法。 (2)掌握词法析的实现方法。 (3)上机调试编出的词法析程序,不限于C语言。 (4)为简单起见,假设编译语言为具有下特征的C_minus。该词法析器要求至少能够识别C_minus中的以下几类单词: a. 关键字:else if int return void while共6个,所有的关键字都是保留字,并且必须是小写; b. 标识符:识别与C语言词法规定相一致的标识符,通过下列正则表达式定义:ID = letter (letter | digit)*; c. 常数:NUM=(+ | - |ε)digit digit*(.digit digit* |ε)(e(+ | - |ε) digit digit* |ε),letter = a|..|z|A|..|Z|,digit = 0|..|9,包括整数,如123, -123, +123等;小数,如123.45, +123.45, -123.45;科学计数法表示的常数,如+1.23e3,-2.3e-9; d. 专用符号:+ - * / < <= > >= == != = ; , ( ) [ ] { } /* */; 参考代码: import java.util.regex.*; public class Lexer { public enum TokenType { KEYWORD, IDENTIFIER, NUMBER, SYMBOL, ERROR } public static class Token { public final TokenType type; public final String lexeme; public Token(TokenType type, String lexeme) { this.type = type; this.lexeme = lexeme; } @Override public String toString() { return "<" + type + ", " + lexeme + ">"; } } public static Token lex(String input) { String pattern = "\\s*(?<KEYWORD>else|if|int|return|void|while)" + "|(?<IDENTIFIER>[a-zA-Z][a-zA-Z0-9]*)" + "|(?<NUMBER>[+-]?(?:\\d+(?:\\.\\d*)?|\\.\\d+)(?:[eE][+-]?\\d+)?)" + "|(?<SYMBOL>[+\\-*/<>=!;,\\[\\]{}()])" + "|(?<ERROR>.+)"; Pattern p = Pattern.compile(pattern); Matcher m = p.matcher(input); if (m.matches()) { if (m.group("KEYWORD") != null) { return new Token(TokenType.KEYWORD, m.group("KEYWORD")); } else if (m.group("IDENTIFIER") != null) { return new Token(TokenType.IDENTIFIER, m.group("IDENTIFIER")); } else if (m.group("NUMBER") != null) { return new Token(TokenType.NUMBER, m.group("NUMBER")); } else if (m.group("SYMBOL") != null) {
最新发布
03-19
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值