1、华为机试题目全解华为机试题【2011】1、(stdlib.h里面定义了五种类型、一些宏和通用工具函数。 类型例如size_t、wchar_t、div_t、ldiv_t和lldiv_t; 宏例如EXIT_FAILURE、EXIT_SUCCESS、RAND_MAX和MB_CUR_MAX等等; 常用的函数如malloc()、calloc()、realloc()、free()、system()、atoi()、atol()、rand()、srand()、exit())#include #include#include#include#define LENGTH 13int verifyMsisdn(ch
2、ar *inMsisdn)char *pchar=NULL;assert(inMsisdn!=NULL);if(LENGTH=strlen(inMsisdn)if(8=*inMsisdn)&(*(inMsisdn+1)=6)while(*inMsisdn!=0)if(*inMsisdn=0)&(*inMsisdn=0)res+=a;return res;/res没有初始化5.struct nodeint data;node* pre;node* next;结构体数组转双向循环链表1. 数组比较(20 分) 问题描述:比较两个数组,要求从数组最后一个元素开始逐个元素向前比较,如果 2 个数组长度
3、不等,则只比较较短长度数组个数元素。请编程实现上述比较,并返回比较中发现的不相等元素的个数比如:数组1,3,5和数组77,21,1,3,5按题述要求比较,不相等元素个数为 0数组1,3,5和数组77,21,1,3,5,7按题述要求比较,不相等元素个数为 3 要求实现函数:int array_compare(int len1, int array1, int len2, int array2)【输入】 int len1:输入被比较数组 1 的元素个数;int array1:输入被比较数组 1;int len2:输入被比较数组 2 的元素个数;int array2:输入被比较数组 2;【输出】 无
4、【返回】 不相等元素的个数,类型为 int 示例1) 输入:int array1 = 1,3,5,int len1 = 3,int array2 = 77,21,1,3,5,int len2 = 5函数返回:02) 输入:int array1 = 1,3,5,int len1 = 3,int array2 = 77,21,1,3,5,7,int len2 = 6函数返回:#include#include#includeint array_compare(int len1, int array1, int len2, int array2)int count=0;for( ;len10&len2
5、0 ;len1-,len2-)if(array1len1-1!=array2len2-1) count+; /蓝色字体部分也可以换成如下的代码 if(array1len1-1=array2len2-1) break; else count+;return count;int main()int result=0;int array1=1,3,5;int len1=3;int array2=77,12,1,3,5;int len2=5;result=array_compare( len1, array1, len2, array2);/result=array_compare( len1, ar
6、ray1, len2, array2);不能这样/ 函数形参中永远只是传得首地址,不能传数组 切记切记!printf(the result is %d, result);2. 约瑟夫问题 问题描述:输入一个由随机数组成的数列(数列中每个数均是大于 0 的整数,长度已知),和初始计数值 m。从数列首位置开始计数,计数到 m 后,将数列该位置数值替换计数值 m,并将数列该位置数值出列,然后从下一位置从新开始计数,直到数列所有数值出列为止。如果计数到达数列尾段,则返回数列首位置继续计数。请编程实现上述计数过程,同时输出数值出列的顺序比如: 输入的随机数列为:3,1,2,4,初始计数值 m=7,从数列
7、首位置开始计数(数值 3 所在位置)第一轮计数出列数字为 2,计数值更新 m=2,出列后数列为 3,1,4,从数值 4 所在位置从新开始计数第二轮计数出列数字为 3,计数值更新 m=3,出列后数列为 1,4,从数值 1 所在位置开始计数第三轮计数出列数字为 1,计数值更新 m=1,出列后数列为 4,从数值 4 所在位置开始计数最后一轮计数出列数字为 4,计数过程完成。输出数值出列顺序为:2,3,1,4。 要求实现函数:void array_iterate(int len, int input_array, int m, int output_array)【输入】 int len:输入数列的长度
8、;int intput_array:输入的初始数列int m:初始计数值【输出】 int output_array:输出的数值出列顺序【返回】 无 示例输入:int input_array = 3,1,2,4,int len = 4, m=7输出:output_array = 2,3,1,4/循环链表实现/#include#include#includetypedef struct Nodeint num;struct Node *next;node;node *creat(int len,int input_array)node *h,*p,*s;int i;h=(node*)malloc(
9、sizeof(node);h-num=input_array0;p=h;for(i=1;inum=input_arrayi;p-next=s;p=s; p-next=h;return(h); void array_iterate(int len, int input_array, int m, int output_array)node *p,*q,*s;int i=0,j=0,k;p=creat(len,input_array);while(p-next!=p)for(i=1;inext; m=p-num;printf(%5d,m);output_arrayj+=m;s=p;q-next=p
10、-next;p=p-next;free(s);s=NULL;m=p-num;printf(%5dn,m);output_arrayj=m;k=j;for(j=0;j=k;j+)printf(%5d,output_arrayj);int main()int input_array=3,1,2,4;int len=4;int m=7;int output_array4;array_iterate(len,input_array,m,output_array); 3. 简单四则运算 问题描述:输入一个只包含个位数字的简单四则运算表达式字符串,计算该表达式的值注: 1、表达式只含 +, -, *, /
11、 四则运算符,不含括号2、表达式数值只包含个位整数(0-9),且不会出现 0 作为除数的情况3、要考虑加减乘除按通常四则运算规定的计算优先级4、除法用整数除法,即仅保留除法运算结果的整数部分。比如 8/3=2。输入表达式保证无 0 作为除数情况发生5、输入字符串一定是符合题意合法的表达式,其中只包括数字字符和四则运算符字符,除此之外不含其它任何字符,不会出现计算溢出情况 要求实现函数:int calculate(int len,char *expStr)【输入】 int len: 字符串长度;char *expStr: 表达式字符串;【输出】 无【返回】 计算结果 示例1) 输入:char *
12、expStr = “1+4*5-8/3”函数返回:192) 输入:char *expStr = “8/3*3”函数返回:6第六题:类似昨天 Sara 说的最后一题:给你一个数组 a,数组长度 len 以及一个整数 m从数组中第一个数字数起 找到第 m 个数字 输出 am 然后再将 am赋值给m,从数组的下一个元素数起,找到第 m 个元素输出,以此进行直到数组中的元素全部输出第五题:一副牌中发五张扑克牌给你:让你判断数字的组成:有以下几种情况:1:四条:即四张一样数值的牌(牌均不论花色)2:三条带一对3:三条带两张不相同数值的牌4:两对5:顺子 包括 10,J,Q,K,A6:什么都不是7:只有一
13、对第一题:比较一个数组的元素 是否为回文数组#include #include int huiwen(char str)int i,len,k=1;len=strlen(str);for(i=0;ilen/2;i+)if(stri!=strlen-i-1)k=1;break;if(k=0)printf(%s 不是一个回文数n,str);elseprintf(%s 是一个回文数n,str);void main()char str100 = 0;int i;int len;printf(Input a string:); /*提示输入 Input a string:*/scanf(%s, str)
14、; /*scan()函数输入一个字符串:*/huiwen(str);第二题:求两个数组的和差 就是去掉两个数组中相同的元素 然后将两个数组中的元素存放在一个新的数组中 切数组 A 中元素要在 B 数组元素之前第三题:比较汗 求简单的四则运算参与运算的数字只有 0-9逆序单链表第一题【20 分】:鉴定回文数组。第二题【30 分】:求两个整型数组的异集,即 A+B-(A 与 B 的交集)。第三题【50 分】:判定德州扑克的牌型。给 5 张牌,返回它的牌型,4 个的,3个+对子,顺子,3 个+2 个单张,2 对,1 对,其他。上午是输入一个数组,然后找出哪个比平均值大上午是输入一个数组,然后找出哪个
15、比平均值大1. 手机号码合法性判断(20 分)问题描述:我国大陆运营商的手机号码标准格式为:国家码+手机号码,例如:8613912345678。特点如下:1、 长度 13 位;2、 以 86 的国家码打头;3、 手机号码的每一位都是数字。请实现手机号码合法性判断的函数要求:1) 如果手机号码合法,返回 0;2) 如果手机号码长度不合法,返回 13) 如果手机号码中包含非数字的字符,返回 2;4) 如果手机号码不是以 86 打头的,返回 3;【注】除成功的情况外,以上其他合法性判断的优先级依次降低。也就是说,如果判断出长度不合法,直接返回 1 即可,不需要再做其他合法性判断。要求实现函数:int
16、 s int verifyMsisdn(char* inMsisdn)【输入】 char* inMsisdn,表示输入的手机号码字符串。【输出】 无【返回】 判断的结果,类型为 int。示例输入: inMsisdn = “869123456789“输出: 无返回: 1输入: inMsisdn = “88139123456789“输出: 无返回: 3输入: inMsisdn = “86139123456789“输出: 无返回: 02. 将一个字符串的元音字母复制到另一个字符串,并排序(30 分)问题描述:有一字符串,里面可能包含英文字母(大写、小写)、数字、特殊字符,现在需要实现一函数,将此字符
17、串中的元音字母挑选出来,存入另一个字符串中,并对字符串中的字母进行从小到大的排序(小写的元音字母在前,大写的元音字母在后,依次有序)。说明:1、 元音字母是 a,e,i,o,u,A,E,I,O,U。2、 筛选出来的元音字母,不需要剔重;最终输出的字符串,小写元音字母排在前面,大写元音字母排在后面,依次有序。要求实现函数:void sortVowel (char* input, char* output);【输入】 char* input,表示输入的字符串【输出】 char* output,排好序之后的元音字符串。【返回】 无示例输入:char *input = “Abort!May Be So
18、me Errors In Out System. “输出:char *output =“aeeeooAEIO “3. 身份证号码合法性判断问题描述:我国公民的身份证号码特点如下:1、 长度为 18 位;2、 第 117 位只能为数字;3、 第 18 位可以是数字或者小写英文字母 x。4、 身份证号码的第 714 位表示持有人生日的年、月、日信息。例如:511002 19880808 0111 或 511002 198*x。请实现身份证号码合法性判断的函数。除满足以上要求外,需要对持有人生日的年、月、日信息进行校验。年份大于等于 1900 年,小于等于 2100 年。需要考虑闰年、大小月的情况。
19、所谓闰年,能被 4 整除且不能被 100 整除 或 能被 400整除的年份,闰年的 2 月份为 29 天,非闰年的 2 月份为 28 天。其他情况的合法性校验,考生不用考虑。函数返回值:1) 如果身份证号合法,返回 0;2) 如果身份证号长度不合法,返回 1;3) 如果身份证号第 117 位含有非数字的字符,返回 2;4) 如果身份证号第 18 位既不是数字也不是英文小写字母 x,返回 3;5) 如果身份证号的年信息非法,返回 4;6) 如果身份证号的月信息非法,返回 5;7) 如果身份证号的日信息非法,返回 6(请注意闰年的情况);【注】除成功的情况外,以上其他合法性判断的优先级依次降低。也
20、就是说,如果判断出长度不合法,直接返回 1 即可,不需要再做其他合法性判断。要求实现函数:int verifyIDCard(char* input)示例1) 输入:”511002 111222”,函数返回值:1;2) 输入:”511002 abc123456789”,函数返回值:2;3) 输入:”511002 19880808123a”,函数返回值:3;4) 输入:”511002 188*4”,函数返回值:4;5) 输入:”511002 198*4”,函数返回值:5;6) 输入:”511002 198*4”,函数返回值:6;7) 输入:”511002 1989 0229 1234”,函数返回值
21、:7;8) 输入:”511002 198*4”,函数返回值:0;第一个:比较两个数组的元素是否相同从后向前比较 ,直到比较完较短的一个数组为止。出现不同元素就返回 0 相同则返回 1第二题:比较一个数组的元素 是否为回文数组第三题:求两个数组的和差 就是去掉两个数组中相同的元素 然后将两个数组中的元素存放在一个新的数组中 切数组 A 中元素要在 B 数组元素之前第四题:比较汗 求简单的四则运算第五题:一副牌中发五张扑克牌给你:让你判断数字的组成:有以下几种情况:1:四条:即四张一样数值的牌(牌均不论花色)2:三条带一对3:三条带两张不相同数值的牌4:两对5:顺子 包括 10,J,Q,K,A6:
22、什么都不是第六题:类似昨天 Sara 说的最后一题:给你一个数组 a,数组长度 len 以及一个整数 m从数组中第一个数字数起 找到第 m 个数字 输出 am 然后再将 am赋值给m,从数组的下一个元素数起,找到第 m 个元素输出,以此进行直到数组中的元素全部输出第一题【20 分】:鉴定回文数组。第二题【30 分】:求两个整型数组的异集,即 A+B-(A 与 B 的交集)。第三题【50 分】:判定德州扑克的牌型。给 5 张牌,返回它的牌型,4 个的,3个+对子,顺子,3 个+2 个单张,2 对,1 对,其他。【2012】1、删除子串,只要是原串中有相同的子串就删掉,不管有多少个,返回子串个数。
23、#include #include #include #include int delete_sub_str(const char *str,const char *sub_str,char *result) assert(str != NULL & sub_str != NULL); const char *p,*q; char *t,*temp; p = str; q = sub_str; t = result; int n,count = 0; n = strlen(q); temp = (char *)malloc(n+1); memset(temp,0x00,n+1); while(
24、*p) memcpy(temp,p,n); if(strcmp(temp,q) = 0 ) count+; memset(temp,0x00,n+1); p = p + n; else *t = *p; p+; t+; memset(temp,0x00,n+1); free(temp); return count;int main() char s100 = 0; int num = delete_sub_str(“123abc12de234fg1hi34j123k”,”123”,s); printf(“The number of sub_str is %drn”,num); printf(“
25、The result string is %srn”,s);2、约瑟夫环是一个数学的应用问题:已知n个人(以编号1,2,3.n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。#include#includetypedef struct Node int num; struct Node *next;LinkList;LinkList *creat(int n) LinkList *p,*q,*head; int i=1; p=(LinkList *)malloc(sizeof(LinkList); p-num=i; head=p; for(i=2;inum=i; p-next=q; p=q; p-next=head; /*使链表尾指向链表头 形成循环链表*/ return head;void fun(LinkList *L,int m) int i; LinkList *p,*s,*q; p=L; printf(出列顺序为:); while(p-next!=p) for(i=1;inext; printf(%5d,p-num); s=p;
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1