2012华为面试 编程题.doc_第1页
2012华为面试 编程题.doc_第2页
2012华为面试 编程题.doc_第3页
2012华为面试 编程题.doc_第4页
2012华为面试 编程题.doc_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

2010年华为软件校园招聘编程测验类别:软件C语言编程题(共2题,第一题40分,第二题60分,共100分。请上机编写程序,按题目要求提交文件。详见考试说明本试题采用自动测试用例进行评分,测试用例不对考生公开,凡不满足提交要求导致不能运行或用例不通过,不予评分)。1. 删除字符串中所有给定的子串(40分)问题描述: 在给定字符串中查找所有特定子串并删除,如果没有找到相应子串,则不作任何操作。要求实现函数: int delete_sub_str(const char *str, const char *sub_str, char *result_str)【输入】 str:输入的被操作字符串 sub_str:需要查找并删除的特定子字符串【输出】 result_str:在str字符串中删除所有sub_str子字符串后的结果【返回】 删除的子字符串的个数注:I、 子串匹配只考虑最左匹配情况,即只需要从左到右进行字串匹配的情况。比如:在字符串abababab中,采用最左匹配子串aba,可以匹配2个aba字串。如果匹配出从左到右位置2开始的aba,则不是最左匹配,且只能匹配出1个aba字串。II、 输入字符串不会超过100 Bytes,请不用考虑超长字符串的情况。示例 输入:str = abcde123abcd123sub_str = 123输出:result_str = abcdeabcd返回:2输入:str = abcde123abcd123sub_str = 1234输出:result_str = abcde123abcd123返回:0view plaincopy to clipboardprint?01.#include 02.#include 03.#include 04. 05./*删除字串函数,在src中删除sub子串,并将结果保存在result字符串中*/ 06.int delSubStr(char * src,char * sub,char * result) 07. 08. char * src_p=src; 09. char * sub_p=sub; 10. char * res_p=result; 11. int count=0;/记录包含子串的个数 12. int sub_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. return count;/返回包含子串的个数 31. 32. 33.void main() 34. 35. char result100; 36. int count=delSubStr(abcdefgde,de,result); 37. printf(The new string is:); 38. printf(%sn,result); 39. printf(count is:); 40. printf(%dn,count); 41. 2. 高精度整数加法(60分)问题描述: 在计算机中,由于处理器位宽限制,只能处理有限精度的十进制整数加减法,比如在32位宽处理器计算机中,参与运算的操作数和结果必须在-231231-1之间。如果需要进行更大范围的十进制整数加法,需要使用特殊的方式实现,比如使用字符串保存操作数和结果,采取逐位运算的方式。如下:9876543210 + 1234567890 = ?让字符串 num1=9876543210,字符串 num2=1234567890,结果保存在字符串 result = 11111111100。-9876543210 + (-1234567890) = ?让字符串 num1=-9876543210,字符串 num2=-1234567890,结果保存在字符串 result = -11111111100。要求编程实现上述高精度的十进制加法。要求实现函数: void add (const char *num1, const char *num2, char *result)【输入】num1:字符串形式操作数1,如果操作数为负,则num10为符号位-num2:字符串形式操作数2,如果操作数为负,则num20为符号位-【输出】result:保存加法计算结果字符串,如果结果为负,则result0为符号位。注:I、 当输入为正数时,+不会出现在输入字符串中;当输入为负数时,-会出现在输入字符串中,且一定在输入字符串最左边位置;II、 输入字符串所有位均代表有效数字,即不存在由0开始的输入字符串,比如0012, -0012不会出现;III、 要求输出字符串所有位均为有效数字,结果为正或0时+不出现在输出字符串,结果为负时输出字符串最左边位置为-。示例 输入:num1 = 580num2 = -50输出:result = 530输入:num1 = 580num2 = -600输出:result = -20程序代码(C语言):01.#include 02.#include 03. 04./*判断字符串整数是否合法,合法返回1,否则返回0*/ 05.int isLegalNum(const char * num) 06. 07. const char * num_p=num; 08. int num_len;/记录整数长度(不包含符号位和结束符0) 09. 10. /*字符串指针为空,不是合法的整数,返回0*/ 11. if(num_p=NULL) 12. return 0; 13. if(*num_p=-) 14. num_p+; 15. num_len=strlen(num); 16. 17. /*不合法整数,返回0*/ 18. if(*num_p57) 19. return 0; 20. int i; 21. for(i=0;i57|*num_p48) 25. return 0; 26. 27. return 1; 28. 29. 30./*将字符串逆序*/ 31.void reverseStr(char * result) 32. 33. int i; 34. char temp; 35. int res_len=strlen(result); 36. for(i=0;ires_len/2;i+) 37. 38. temp=resulti; 39. resulti=resultres_len-i-1; 40. resultres_len-i-1=temp; 41. 42. 43. 44./*加法函数,用于将两个字符串形式的整数相加,结果保存在 char * result 中*/ 45.void add (const char * num1, const char * num2, char * result) 46. 47. /*判断两个字符串整数 num1 和 num2 是否合法,如果不合法则要求用户重新输入*/ 48. if(!(isLegalNum(num1)&isLegalNum(num2) 49. 50. strcpy(result,对不起,您输入的字符串整数不是合法的十进制整数,请您检查后重新输入,谢谢合作!); 51. return; 52. 53. int count=0;/记录进位或借位 54. const char * num1_p;/记录第一个数的字符串起始地址 55. const char * num2_p;/记录第二个数的字符串起始地址 56. char * res_p=result;/记录结果字符串起始地址 57. int num1_len=strlen(num1);/第一个数的长度 58. int num2_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. int i; 71. for(i=0;inum1_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_lennum2_len) 81. 82. for(i=0;inum1_len-num2_len;i+) 83. 84. *res_p+=(*num1_p-0+count)%10+0; 85. count=(*num1_p-0+count)/10; 86. num1_p-; 87. 88. 89. 90. /*如果第一个数的长度小于第二个数*/ 91. else if(num1_lennum2_len) 92. 93. for(i=0;inum2_len-num1_len;i+) 94. 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. int i; 113. for(i=0;inum1_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_lennum2_len) 123. 124. for(i=0;inum1_len-num2_len;i+) 125. 126. *res_p+=(*num1_p-0+count)%10+0; 127. count=(*num1_p-0+count)/10; 128. num1_p-; 129. 130. 131. 132. /*如果第一个数的长度小于第二个数*/ 133. else if(num1_lennum2_len) 134. 135. for(i=0;inum2_len|num1_len=num2_len&strcmp(num1,num2)0) 174. 175. int i; 176. for(i=0;i=*num2_p) 180. 181. *res_p+=(*num1_p-*num2_p-count)%10+0; 182. count=0; 183. 184. 185. /*借位*/ 186. else if(*num1_p-count*num2_p) 187. 188. *res_p+=(*num1_p+10-*num2_p-count)%10+0; 189. count=1; 190. 191. num1_p-; 192. num2_p-; 193. 194. for(i=0;i=0) 198. 199. *res_p+=(*num1_p-0-count)%10+0; 200. count=0; 201. 202. 203. /*借位*/ 204. else if(*num1_p-0-count0) 205. 206. *res_p+=(*num1_p+10-0-count)%10+0; 207. count=1; 208. 209. num1_p-; 210. 211. do 212. 213. res_p-; 214. 215. while(*res_p=0); 216. 217. /*num1是负数且绝对值大,所以此时结果为负数*/ 218. if(temp=1) 219. 220. res_p+; 221. *res_p+=-; 222. *res_p=0; 223. reverseStr(result); 224. 225. 226. /*num1是正数且绝对值大,所以此时结果为正数*/ 227. else if(temp=2) 228. 229. res_p+; 230. *res_p=0; 231. reverseStr(result); 232. 233. 234. 235. /*num2绝对值大*/ 236. else if(num1_lennum2_len|num1_len=num2_len&strcmp(num1,num2)0) 237. 238. int i; 239. for(i=0;i=*num1_p) 243. 244. *res_p+=(*num2_p-*num1_p-count)%10+0; 245. count=0; 246. 247. /*借位*/ 248. else if(*num2_p-count*num1_p) 249. 250. *res_p+=(*num2_p+10-*num1_p-count)%10+0; 251. count=1; 252. 253. num1_p-; 254. num2_p-; 255. 256. for(i=0;i=0) 260. 261. *res_p+=(*num2_p-0-count)%10+0; 262. count=0; 263. 264. 265. /*借位*/ 266. else if(*num2_p-0-count0) 267. 268. *res_p+=(*num2_p+10-0-count)%1

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论