iKey:
题目中要求的数目N
【输出】无
【返回】剩下的人的原来的位置
示例
输入:
iTotalNum=5,iKey=3
返回:
4
输入:
iTotalNum=15,iKey=3
返回:
10
3、公交站寻址(50分)
问题描述
一个N*N二维矩阵代表城市布局,元素值只有’.’,’X’,‘B’,‘S’,X代表当前位置,B代表路障,S代表公交站,’.’代表可行的路径。
现给定路径长度Y,找到能够到达的公交站的个数,路径中不能包含路障。
路径长度定义:
节点与其自身的距离为0
节点与其上、下、左、右四个相邻节点距离都为1
要求实现函数
intFindStat(constchar*Map,unsignedintiArrN,unsignedintiPathLen)
【输入】Map:
城市布局
iArrN:
城市布局矩阵的行数
iPathLen:
给定的路径长度
【输出】无
【返回】能够到达的公交站个数
注:
输入矩阵是以一维形式保存的二维数组,
比如输入为{‘A’,‘B’,‘C’,‘D’,‘E’,‘F’,’G’,‘H’,‘I’},
实际上表示如下3*3的矩阵
‘A’,’B’,’C’,
‘D’,’E’,’F’,
‘G’,’H’,’I’
示例
输入:
"...S........X.S.....S....",5,3
返回:
2
输入:
"S...S.........BS........X",5,5
返回:
1
2011华为编程大赛初赛成都赛区试题(c语言b卷)
2011-05-3014:
192126人阅读评论(0)收藏举报
编程华为语言c测试算法
2011年华为杯校园编程大赛
类别:
软件C语言
编程题(共3题,第一题20分,第二题30分,第三题50分,共100分。
请上机编写程序,按题目要求提交文件。
[详见考试说明]
本试题采用自动测试用例进行评分,测试用例不对考生公开,凡不满足提交要求导致不能运行或用例不通过,不予评分)。
1、排序算法(20分)
l问题描述
将给定的无序整数数组降序排列后输出,输入的无序数组长度为N,类型为unsignedint
l要求实现函数
voidDscSort(constintInputArray[],unsignedintn,intOutputArray[])
【输入】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要求实现函数
unsignedintGetNotRepeatNum(unsignedintlValue)
【输入】lValue:
给定的数字,返回大于该值的最小不重复数
【输出】无
【返回】大于iValue的最小不重复数
l示例
输入:
iValue=54
返回:
56
输入:
iValue=10
返回:
12
输入:
iValue=98
返回:
101
输入:
iValue=21099
返回:
21201
3、字符串匹配(50分)
l问题描述
判断包含通配符的匹配字符串是否完全匹配输入的字符串,匹配字符串中包含的通配符仅有‘*’和‘?
’,且通配符不会连续出现。
(要求完全匹配,而不是包含)
其中,通配符‘*’:
代替0个或多个字符,通配符‘?
’:
代替一个字符
l要求实现函数
intGetMatchSta(constchar*ArrStr,constchar*KeyStr)
【输入】ArrStr:
给定的字符串
KeyStr:
包含通配符的匹配字符串
【输出】无
【返回】是否匹配,匹配返回1,不匹配返回0
l示例
输入:
”abcdefg”,“a*'”
返回:
1
输入:
“tommababcabc”,t?
m*ab*abc
返回:
1
(前两题很简单,给出第三题参考答案,答案来源于网络)
第三题参考答案:
intGetMatchStr(constchar*ArrStr,constchar*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);
}
}
2010年华为软件校园招聘编程测验
类别:
软件C语言
编程题(共2题,第一题40分,第二题60分,共100分。
请上机编写程序,按题目要求提交文件。
[详见考试说明]
本试题采用自动测试用例进行评分,测试用例不对考生公开,凡不满足提交要求导致不能运行或用例不通过,不予评分)。
1.删除字符串中所有给定的子串(40分)
问题描述:
在给定字符串中查找所有特定子串并删除,如果没有找到相应子串,则不作任何操作。
要求实现函数:
intdelete_sub_str(constchar*str,constchar*sub_str,char*result_str)
【输入】str:
输入的被操作字符串
sub_str:
需要查找并删除的特定子字符串
【输出】result_str:
在str字符串中删除所有sub_str子字符串后的结果
【返回】删除的子字符串的个数
注:
I、子串匹配只考虑最左匹配情况,即只需要从左到右进行字串匹配的情况。
比如:
在字符串"abababab"中,采用最左匹配子串"aba",可以匹配2个"aba"字串。
如果
匹配出从左到右位置2开始的"aba",则不是最左匹配,且只能匹配出1个"aba"字串。
II、输入字符串不会超过100Bytes,请不用考虑超长字符串的情况。
示例
输入:
str="abcde123abcd123"
sub_str="123"
输出:
result_str="abcdeabcd"
返回:
2
输入:
str="abcde123abcd123"
sub_str="1234"
输出result_str="abcde123abcd123"
返回:
0
viewplaincopytoclipboardprint?
01.#include
02.#include
03.#include
04.
05./*删除字串函数,在src中删除sub子串,并将结果保存在result字符串中*/
06.intdelSubStr(char*src,char*sub,char*result)
07.{
08.char*src_p=src;
09.char*sub_p=sub;
10.char*res_p=result;
11.intcount=0;//记录包含子串的个数
12.intsub_len=strlen(sub);//记录子串的长度
13.char*temp;//临时保存子串的副本
14.temp=(char*)malloc(sub_len+1);
15.memset(temp,'\0',sub_len+1);
16.while(*src_p)
17.{
18.memcpy(temp,src_p,sub_len);
19.
20./*原串中包含与sub完全匹配的子串*/
21.if(!
strcmp(temp,sub))
22.{
23.count++;
24.src_p+=sub_len;
25.}
26.else
27.*res_p++=*src_p++;
28.*res_p='\0';
29.free(temp);
30.returncount;//返回包含子串的个数
31.}
32.
33.voidmain()
34.{
35.charresult[100];
36.intcount=delSubStr("abcdefgde","de",result);
37.printf("Thenewstringis:
");
38.printf("%s\n",result);
39.printf("countis:
");
40.printf("%d\n",count);
41.}
2.高精度整数加法(60分)
问题描述:
在计算机中,由于处理器位宽限制,只能处理有限精度的十进制整数加减法,比如在32位宽处理器计算机中,
参与运算的操作数和结果必须在-231~231-1之间。
如果需要进行更大范围的十进制整数加法,需要使用特殊
的方式实现,比如使用字符串保存操作数和结果,采取逐位运算的方式。
如下:
9876543210+1234567890=?
让字符串num1="9876543210",字符串num2="1234567890",结果保存在字符串result="11111111100"。
-9876543210+(-1234567890)=?
让字符串num1="-9876543210",字符串num2="-1234567890",结果保存在字符串result="-11111111100"。
要求编程实现上述高精度的十进制加法。
要求实现函数:
voidadd(constchar*num1,constchar*num2,char*result)
【输入】num1:
字符串形式操作数1,如果操作数为负,则num1[0]为符号位'-'
nu2:
字符串形式操作数2,如果操作数为负,则num2[0]为符号位'-'
【输出】result:
保存加法计算结果字符串,如果结果为负,则result[0]为符号位。
注:
I、当输入为正数时,'+'不会出现在输入字符串中;当输入为负数时,'-'会出现在输入字符串中,且一定在输入字符串最左边位置;
II、输入字符串所有位均代表有效数字,即不存在由'0'开始的输入字符串,比如"0012","-0012"不会出现;
III、要求输出字符串所有位均为有效数字,结果为正或0时'+'不出现在输出字符串,结果为负时输出字符串最左边位置为'-'。
示例
输入:
num1="580"
num2="-50"
输出:
result="530"
输入:
num1="580"
num2="-600"
输出:
result="-20"
程序代码(C语言):
01.#include
02.#include
03.
04./*判断字符串整数是否合法,合法返回'1',否则返回'0'*/
05.intisLegalNum(constchar*num)
06.{
07.constchar*num_p=num;
08.intnum_len;//记录整数长度(不包含符号位和结束符'\0')
09.
10./*字符串指针为空,不是合法的整数,返回'0'*/
11.if(num_p==NULL)
12.return0;
13.if(*num_p=='-')
14.num_p++;
15.num_len=strlen(num);
16.
17./*不合法整数,返回'0'*/
18.if(*num_p<=48||*num_p>57)
19.return0;
20.inti;
21.for(i=0;i22.{
23./*不合法整数,返回'0'*/
24.if(*num_p>57||*num_p<48)
25.return0;
26.}
27.return1;
28.}
29.
30./*将字符串逆序*/
31.voidreverseStr(char*result)
32.{
33.inti;
34.chartemp;
35.intres_len=strlen(result);
36.for(i=0;i37.{
38.temp=result[i];
39.result[i]=result[res_len-i-1];
40.result[res_len-i-1]=temp;
41.}
42.}
43.
44./*加法函数,用于将两个字符串形式的整数相加,结果保存在char*result中*/
45.voidadd(constchar*num1,constchar*num2,char*result)
46.{
47./*判断两个字符串整数num1和num2是否合法,如果不合法则要求用户重新输入*/
48.if(!
(isLegalNum(num1)&&isLegalNum(num2)))
49.{
50.strcpy(result,"对不起,您输入的字符串整数不是合法的十进制整数,请您检查后重新输入,谢谢合作!
");
51.return;
52.}
53.intcount=0;//记录进位或借位
54.constchar*num1_p;//记录第一个数的字符串起始地址
55.constchar*num2_p;//记录第二个数的字符串起始地址
56.char*res_p=result;//记录结果字符串起始地址
57.intnum1_len=strlen(num1);//第一个数的长度
58.intnum2_len=strlen(num2);//第二个数的长度
59.num1_p=num1+num1_len-1;//num1_p指向第一个数的最后一位
60.num2_p=num2+num2_len-1;//num2_p指向第二个数的最后一位
61.
62./*加法运算,此时两个数的符号相同*/
63.if((*num1!
='-'&&*num2!
='-')||(*num1=='-'&&*num2=='-'))
64.{
65./*两个负数相加*/
66.if(*num1=='-'&&*num2=='-')
67.{
68.num1_len--;
69.num2_len--;
70.inti;
71.for(i=0;i<(num2_len>num1_len?
num1_len:
num2_len);i++)
72.{
73.*res_p++=(*num1_p-'0'+*num2_p-'0'+count)%10+'0';
74.count=(*num1_p-'0'+*num2_p-'0'+count)/10;
75.num1_p--;
76.num2_p--;
77.}
78.
79./*如果第一个数的长度大于第二个数*/
80.if(num1_len>num2_len)
81.{
82.for(i=0;i83.{
84.*res_p++=(*num1_p-'0'+count)%10+'0';
85.count=(*num1_p-'0'+count)/10;
86.num1_p--;
87.}
88.}
89.
90./*如果第一个数的长度小于第二个数*/
91.elseif(num1_len92.{
93.for(i=0;i94.{
95.*res_p++=(*num2_p-'0'+count)%10+'0';
96.count=(*num2_p-'0'+count)/10;
97.num2_p--;
98.}
99.}
100.
101./*向最高位进一位*/
102.if(count==1)
103.*res_p++='1';
104.*res_p++='-';
105.*res_p='\0';
106.reverseStr(result);
107.}
108.
109./*两个正数相加*/
110.if(*num1!
='-'&&*num2!
='-')
111.{
112.inti;
113.for(i=0;i<(num2_len>num1_len?
num1_len:
num2_len);i++)
114.{
115.*res_p++=(*num1_p-'0'+*num2_p-'0'+count)%10+'0';
116.count=(*num1_p-'0'+*num2_p-'0'+count)/10;
117.num1_p--;
118.num2_p--;
119.}
120.
121./*如果第一个数的长度大于第二个数*/
122.if(num1