2011 年华为杯校园编程大赛
类别:软件C 语言
编程题(共 3 题,第一题20 分,第二题30 分,第三题50 分,共100 分。请上机编写程序,按题目要求提交文件。[详见考试说明]
本试题采用自动测试用例进行评分,测试用例不对考生公开,凡不满足提交要求导致不能运行或用例不通过,不予评分)。
1、 排序算法( 20 分)
l 问题描述
将给定的无序整数数组降序排列后输出,输入的无序数组长度为 N ,类型为 unsigned int
l 要求实现函数
void DscSort (const int InputArray[], unsigned int n, int OutputArray[])
【输入】 InputArray : 给定的无序数组
n : 数组长度
【输出】 OutputArray : 排序后的数组
【返回】无
l 示例
输入: InputArray={1,5,4,8,3,2,9,6,7,0}
输出: OutputArray={9,8,7,6,5,4,3,2,1,0}
2 、查找最大的不重复数( 30 分)
l 问题描述
如果一个数字十进制表达时,不存在连续两位相同,则称之为“不重复数”。例如, 105 、 1234 和 12121 都是“不重复数”,而 11 、 100 和 1225 不是。给定一个正整数 A ,返回大于 A 的最小“不重复数”。 A 小于 100000
l 要求实现函数
unsigned int GetNotRepeatNum(unsigned int lValue)
【输入】 lValue : 给定的数字,返回大于该值的最小不重复数
【输出】 无
【返回】大于 iValue 的最小不重复数
l 示例
输入: iValue =54
返回: 56
输入: iValue =10
返回: 12
输入: iValue =98
返回: 101
输入: iValue =21099
返回: 21201
3 、字符串匹配( 50 分)
l 问题描述
判断包含通配符的匹配字符串是否完全匹配输入的字符串,匹配字符串中包含的通配符仅有‘ * ’和‘?’,且通配符不会连续出现 。(要求完全匹配,而不是包含)
其中,通配符‘ * ’:代替 0 个或多个字符,通配符‘ ? ’:代替一个字符
l 要求实现函数
int GetMatchSta (const char *ArrStr, const char *KeyStr)
【输入】 ArrStr : 给定的字符串
KeyStr : 包含通配符的匹配字符串
【输出】 无
【返回】是否匹配,匹配返回1 ,不匹配返回0
l 示例
输入: ” abcdefg”, “a*'”
返回: 1
输入: “tommababcabc” , t?m*ab*abc
返回: 1
(前两题很简单,给出第三题参考答案,答案来源于网络)
第三题参考答案:
int GetMatchStr(const char* ArrStr,const char* KeyStr)
{
switch (*KeyStr)
{
case '/0':
return (*ArrStr=='/0')? 1:0;
case '?':
return (*ArrStr=='/0')? 0:GetMatchStr(ArrStr+1,KeyStr+1);
case '*':
return (*ArrStr=='/0')? GetMatchStr(ArrStr,KeyStr+1):
GetMatchStr(ArrStr+1,KeyStr)|GetMatchStr(ArrStr,KeyStr+1);
default:
return (*ArrStr!=*KeyStr)? 0:GetMatchStr(ArrStr+1,KeyStr+1);
}
}