2011年华为软件校园招聘编程测验1、请上机编写程序,按题目要求提交文件。[详见考试说明,点击进入考试说明]3、评卷通过在给定用例输入下,严格按照试题要求比较考生实现函数的输出与预设输出。两者相同则得分,不同则不得分。4、评卷人保证测试用例输入参数的合法性,考生不用考虑输入参数非法或异常的情况5、评卷人保证测试用例输入在被测函数正常合法情况下使用不会导致程序错误6、如果考生函数异常导致程序崩溃或死循环,则自动评卷可能会被人为终止,剩余用例不被执行,无法得分7、基于上述阅卷规则,请考生严格按照题目要求功能实现程序,尽量保证实现函数的稳健性,同时建议完成一道题并调试保证正确性后,再考虑并实现下一题目1,判断电话号码是否合法://要注意情况包含,有可能会同时出现几种不好的情况,要按照顺序输出错误。不能同时输出好几种错误,应该是这样包含:先判断长度是否符合,再判断是否以86打头,再判断有无其他字符intfun(charnum[]){char*p=num;intn=strlen(num);if(n==13){if(*p=='8'&&*(p+1)=='6')while(*p!='\0'){if(*p='0'&&*p='9')p++;elsereturn2;if(*p=='\0')return0;}elsereturn3;}elsereturn1;}intmain(){charnum[]=87139a3887671;intk=fun(num);coutkendl;return0;}1.数组比较(20分)•问题描述:比较两个数组,要求从数组最后一个元素开始逐个元素向前比较,如果2个数组长度不等,则只比较较短长度数组个数元素。请编程实现上述比较,并返回比较中发现的不相等元素的个数比如:数组{1,3,5}和数组{77,21,1,3,5}按题述要求比较,不相等元素个数为0数组{1,3,5}和数组{77,21,1,3,5,7}按题述要求比较,不相等元素个数为3•要求实现函数:intarray_compare(intlen1,intarray1[],intlen2,intarray2[])•示例1)输入:intarray1[]={1,3,5},intlen1=3,intarray2[]={77,21,1,3,5},intlen2=5函数返回:02)输入:intarray1[]={1,3,5},intlen1=3,intarray2[]={77,21,1,3,5,7},intlen2=6函数返回:3函数如下:usingnamespacestd;intf(intlen1,intarry1[],intlen2,intarry2[]){intk=0;for(inti=len1-1,j=len2-1;i=0&&j=0;i--,j--)if(arry1[i]!=arry2[j])k++;returnk;}intmain(){intnum1[]={1,3,5};intnum2[]={77,21,1,3,5};intk=f(3,num1,5,num2);coutkendl;return0;}2.约瑟夫问题•问题描述:输入一个由随机数组成的数列(数列中每个数均是大于0的整数,长度已知),和初始计数值m。从数列首位置开始计数,计数到m后,将数列该位置数值替换计数值m,并将数列该位置数值出列,然后从下一位置从新开始计数,直到数列所有数值出列为止。如果计数到达数列尾段,则返回数列首位置继续计数。请编程实现上述计数过程,同时输出数值出列的顺比如:输入的随机数列为:3,1,2,4,初始计数值m=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。•要求实现函数:voidarray_iterate(intlen,intinput_array[],intm,intoutput_array[])【输入】intlen:输入数列的长度;intintput_array[]:输入的初始数列intm:初始计数值【输出】intoutput_array[]:输出的数值出列顺序•示例输入:intinput_array[]={3,1,2,4},intlen=4,m=7输出:output_array[]={2,3,1,4}函数如下:voidfun(intlen,inta1[],intlen2,inta2[]){intn=0,i=-1,k=1,m=len2;while(1){for(intj=0;jm;){i=(i+1)%len;//注意这个是%,不要写成/if(a1[i]!=0)j++;}m=a1[i];a2[n++]=a1[i];a1[i]=0;if(k==len)break;k++;}}3.简单四则运算•问题描述:输入一个只包含个位数字的简单四则运算表达式字符串,计算该表达式的值注:1、表达式只含+,-,*,/四则运算符,不含括号2、表达式数值只包含个位整数(0-9),且不会出现0作为除数的情况3、要考虑加减乘除按通常四则运算规定的计算优先级4、除法用整数除法,即仅保留除法运算结果的整数部分。比如8/3=2。输入表达式保证无0作为除数情况发生5、输入字符串一定是符合题意合法的表达式,其中只包括数字字符和四则运算符字符,除此之外不含其它任何字符,不会出现计算溢出情况•要求实现函数:intcalculate(intlen,char*expStr)【输入】intlen:字符串长度;char*expStr:表达式字符串;【输出】无【返回】计算结果•示例1)输入:char*expStr=“1+4*5-8/3”函数返回:192)输入:char*expStr=“8/3*3”函数返回:6简化版的四则运算:没有括号,只有加减乘除四种运算intfun(chara[],intlen)//字符数组和字符数组的长度{intnum[20];charstr[20];intk1=0,k2=0;intdata=0;for(inti=0;ilen;i++)//主要运算{if(a[i]='0'&&a[i]='9')num[k1++]=a[i]-'0';if(a[i]=='-'||a[i]=='+')str[k2++]=a[i];if(a[i]=='*'){num[k1-1]=num[k1-1]*(a[i+1]-'0');i++;}//遇见*,就运算,结果保存在数组中if(a[i]=='/'){num[k1-1]=num[k1-1]/(a[i+1]-'0');i++;}}inttemp=num[0];intj=0;//两个数组只剩下数组和加减运算符while(jk2){//顺序运算if(str[j]=='-')temp=temp-num[j+1];elseif(str[j]='+')temp=temp+num[j+1];j++;}returntemp;}intmain(){hara[]=3*3+7+4/3;intk=fun(a,9);coutkendl;return0;}函数实现2:中序表达式转换为后序表达式,使用算法实现intisp(charc){intp;switch(c){case'*':case'/':p=1;break;case'+':case'-':p=0;break;}returnp;}char*transf(intlen,chara[],charb[]){intk=0;stackchars1;for(inti=0;ilen;i++){if(a[i]='0'&&a[i]='9')b[k++]=a[i];else{if(s1.empty())s1.push(a[i]);elsewhile(isp(a[i])=isp(s1.top())){b[k++]=s1.top();s1.pop();}s1.push(a[i]);}}while(s1.empty()){b[k++]=s1.top();s1.pop();}b[k]='\0';returnb;}voidfun(charc,stacks2){charp1,p2;if(!s2.empty()){p1=s2.top();s2.pop();elsepos=false;coutkongzhanendl;}if(!s2.empty()){p2=s2.top();s2.top();elsepos=false;coutkongzhanendl;}if(pos=true)switch(c){case'+':s2.push(p1+p2);break;case'-':s2.push(p2-p1);break;case'*':s2.push(p1*p2);break;case'/':s2.push(p2/p1);break;}}voideval(chara[]){stackchars2;for(inti=len;ilen;i++){switch(a[i]){case'+':case'-':case'*':case'/':fun(a[i],&s2);break;default:s2.push(a[i]-'0');break;}}}intmain(){chara[]=1+4*5-8/3;intlen=strlen(a);charb[20];char*q=transf(9,a,b);coutqendl;return0;}第五题:一副牌中发五张扑克牌给你:让你判断数字的组成:有以下几种情况:1:四条:即四张一样数值的牌(牌均不论花色)2:三条带一对3:三条带两张不相同数值的牌4:两对5:顺子包括10,J,Q,K,A6:什么都不是7:只有一对思路:将数组排序,统计相同的数字的个数,再分情况讨论voidsort(inta[]){inttemp;for(inti=0;i5;i++)for(intj=0;j5;j++)if(a[i]a[j]){temp=a[i];a[i]=a[j];a[j]=temp;}}//修改的排序voidsort(inta[]){inttemp;for(inti=0;i5;i++)for(intj=i+1;j5;j++)if(a[i]a[j]){temp=a[i];a[i]=a[j];a[j]=temp;}}voidtest(inta[]){int*b=newint[5];intk=1;for(inti=0;i5;i++){b[i]=a[i];}for(intj=0;j4;j++)if(a[j]==a[j+1])k++;if(k==4){if(b[1]==b[3])cout四条endl;elsecout三条带一对endl;}if(k==3){if(b[1]!=b[2]||b[2]!=b[3])cout三条带两个不同的牌endl;elsecout两对endl;}if(k==2)cout一对endl;if(k==1){if(b[4]-b[0]==4&&b[4]-b[1]==3&&b[4]-b[2]==2&&b[4]-b[3]==1)cout顺子endl;elsecout什么都不是endl;}}intmain(){inta[]={1,2,4,4,4};test(a);return0;}第二题:求两个数组的和差就是去掉两个数组中相同的元素然后将两个数组中的元素存放在一个新的数组中,按大小顺序排序思路:将数组A和数组B分别进行排序,然后将A与B进行比较,重复的跳过去,不重复的赋给数组C,依次输出。while(ila&&jlb){if(aa[i]bb[j]){c[sub]=aa[i];++sub;++i;}e