华为上机试题及答案2DOC.docx
《华为上机试题及答案2DOC.docx》由会员分享,可在线阅读,更多相关《华为上机试题及答案2DOC.docx(36页珍藏版)》请在冰点文库上搜索。
华为上机试题及答案2DOC
目录
样题-初级题:
从考试成绩中划出及格线2
样题-中级题:
亮着电灯的盏数2
样题-高级题:
地铁换乘3
8.29去掉最大值、最小值之后剩下的个数3
8.29从5个人中选取2个人作为礼仪4
8.29验证括号是否匹配5
8.31回文数5
8.31将第一行中含有第二行中“23”的数输出并排序6
8.31翻译电话号码6
9.1.AM将整数倒序输出,剔除重复数据7
9.1.AM大数相减8
9.1.AM判断if语句括号是否合法8
9.1.PM8
9.1.PM9
9.1.PM9
样题-初级题:
从考试成绩中划出及格线
10个学生考完期末考试评卷完成后,A老师需要划出及格线,要求如下:
(1) 及格线是10的倍数;
(2) 保证至少有60%的学生及格;
(3) 如果所有的学生都高于60分,则及格线为60分
#include
voidsort(inta[])
{
inti,j,t;
for(i=0;i<10;i++)
for(j=i+1;j<10;j++)
{
if(a[i]>a[j])
{
t=a[i];
a[i]=a[j];
a[j]=t;
}
}
}
intmain()
{
intnum[10]={0};
scanf("%d%d%d%d%d%d%d%d%d%d",&num[0],&num[1],&num[2],&num[3],&num[4],&num[5],&num[6],&num[7],&num[8],&num[9]);
sort(num);
if(num[0]>60)
printf("60");
else
printf("%d",(num[4]/10)*10);
return0;
}
样题-中级题:
亮着电灯的盏数
一条长廊里依次装有n(1 ≤ n ≤ 65535)盏电灯,从头到尾编号1、2、3、…n-1、n。
每盏电灯由一个拉线开关控制。
开始,电灯全部关着。
有n个学生从长廊穿过。
第一个学生把号码凡是1的倍数的电灯的开关拉一下;接着第二个学生把号码凡是2的倍数的电灯的开关拉一下;接着第三个学生把号码凡是3的倍数的电灯的开关拉一下;如此继续下去,最后第n个学生把号码凡是n的倍数的电灯的开关拉一下。
n个学生按此规定走完后,长廊里电灯有几盏亮着。
注:
电灯数和学生数一致。
#include
#defineMAX65535
intGetNum(intn)
{
inti,j,num=0;
chara[MAX]={0};
if((n<1)||(n>MAX))
return0;
for(i=1;ifor(j=1;j{
if((j%i)==0)
{
a[j]+=1;
a[j]%=2;
}
}
for(i=1;i{
if(1==a[i])
num++;
}
returnnum;
}
intmain()
{
inta;
scanf("%d",&a);
printf("%d",GetNum(a));
return0;
}
优化后:
#include
intmain()
{
inti,j,n;
intcnt=0;
scanf("%d",&n);
for(i=1;;i++)
{
j=i*i;
if(j>n)
break;
cnt++;
}
printf("%d",cnt);
return0;
}
样题-高级题:
地铁换乘
已知2条地铁线路,其中A为环线,B为东西向线路,线路都是双向的。
经过的站点名分别如下,两条线交叉的换乘点用T1、T2表示。
编写程序,任意输入两个站点名称,输出乘坐地铁最少需要经过的车站数量(含输入的起点和终点,换乘站点只计算一次)。
地铁线A(环线)经过车站:
A1 A2 A3 A4 A5 A6 A7 A8 A9 T1 A10 A11 A12 A13 T2 A14 A15 A16 A17 A18
地铁线B(直线)经过车站:
B1 B2 B3 B4 B5 T1 B6 B7 B8 B9 B10 T2 B11 B12 B13 B14 B15
//描述:
已知2条地铁线路,其中A为环线,B为东西向线路,线路都是双向的。
经过的站点名分别如下,两条线交叉的换乘点用T1、T2表示。
编写程序,任意输入两个站点名称,输出乘坐地铁最少需要经过的车站数量(含输入的起点和终点,换乘站点只计算一次)。
//地铁线A(环线)经过车站:
A1A2A3A4A5A6A7A8A9T1A10A11A12A13T2A14A15A16A17A18
//地铁线B(直线)经过车站:
B1B2B3B4B5T1B6B7B8B9B1!
0T2B11B12B13B14B15
//输入:
输入两个不同的站名
//输出:
输出最少经过的站数及名称,含输入的起点和终点,换乘站点只计算一次
#include
#include
#include
#defineinf1000//定义无穷远距离
#definestanum35//定义总站台数
usingnamespacestd;
strings1[stanum]={"A1","A2","A3","A4","A5","A6","A7","A8","A9","A10",
"A11","A12","A13","A14","A15","A16","A17","A18",
"B1","B2","B3","B4","B5","B6","B7","B8","B9","B10",
"B11","B12","B13","B14","B15","T1","T2"};//记录车站的名字
voidfloyd(intdis[][stanum],intpath[][stanum])
{
//初始化path矩阵
for(introw=0;rowfor(intcol=0;colpath[row][col]=row;
//找最短路径
for(intk=0;kfor(inti=0;ifor(intj=0;jif(dis[i][j]>dis[i][k]+dis[k][j])
{
dis[i][j]=dis[i][k]+dis[k][j];
path[i][j]=path[k][j];
}
}
intstring2int(strings)//转换车站的名字到矩阵的索引
{
for(inti=0;iif(s==s1[i])
{
returni;
break;
}
}
voidprintres(intdis[][stanum],intpath[][stanum],stringstart,stringdest)
{
cout<<"startstationtodestinationdistancepath"<cout<<"\t"<"<ints;
intd;
s=string2int(start);
d=string2int(dest);
cout<<"\t"<for(inti=0;ifor(intj=0;j{
if(i==s&&j==d)//输出路径
{
stackpathrout;//压栈
intk=j;
do
{
k=path[i][k];
pathrout.push(k);
}while(k!
=i);
//弹栈
cout<pathrout.pop();
intlength=pathrout.size();
for(intt=0;t{
cout<<"->"<pathrout.pop();
}
cout<<"->"<break;
}
}
}
intmain()
{
intdistance[stanum][stanum];
intpath[stanum][stanum];
stringstart;
stringdest;
//初始化连接矩阵
for(inti=0;i{
for(intj=0;j{
if(i==j)
distance[i][j]=0;
else
distance[i][j]=inf;
}
}
//初始化技巧
intsa[21]={0,1,2,3,4,5,6,7,8,33,9,10,11,12,34,13,14,15,16,17,0};
for(intm=0;m<20;m++)
{
distance[sa[m]][sa[m+1]]=1;
distance[sa[m+1]][sa[m]]=1;
}
intsb[17]={18,19,20,21,22,33,23,24,25,26,27,34,28,29,30,31,32};
for(intn=0;n<16;n++)
{
distance[sb[n]][sb[n+1]]=1;
distance[sb[n+1]][sb[n]]=1;
}
floyd(distance,path);
cout<<"inputstartanddestination"<cin>>start>>dest;
printres(distance,path,start,dest);
system("pause");
return0;
}
8.29去掉最大值、最小值之后剩下的个数
1、输入一串数,以','分隔,输出所有数中去掉最大值、最小值之后剩下的个数。
(其中最大值与最小值可能有多个)
Smpleinput:
3,3,5,3,6,9,7,9SampleoutPut:
3
#include
intmain()
{
inta[100]={0},n=0,temp,min,max,i,j,num=0;
charc='0';
n=0;
while(c!
='\n')
{
scanf("%d",&temp);
scanf("%c",&c);
a[n]=temp;
n++;
}
max=min=a[0];
for(i=0;i{
a[i]=a[i*2];
}
for(i=0;i<(n+1)/2;i++)
{
if(a[i]>max)
max=a[i];
if(a[i]min=a[i];
}
for(j=0;j<(n+1)/2;j++)
{
if((a[j]min))
num++;
}
printf("%d",num);
return0;
}
8.29从5个人中选取2个人作为礼仪
2、要从5个人中选取2个人作为礼仪,其中每个人的身高范围为160-190,要求2个人的身高差值最小(如果差值相同的话,选取其中最高的两人),以升序输出两个人的身高。
Smpleinput:
161189167172188SampleoutPut:
188189
#include
#include
voidsort(inta[])
{
inti,j,temp;
for(i=0;i<5;i++)
for(j=0;j<5;j++)
{
if(a[i]{
temp=a[i];
a[i]=a[j];
a[j]=temp;
}
}
}
intmain()
{
inta[5]={0},b[4]={0};
inti,temp;
for(i=0;i<5;i++)
scanf("%d",&a[i]);
sort(a);
for(i=0;i<5;i++)
{
b[i]=abs(a[i+1]-a[i]);
}
temp=b[0];
for(i=0;i<4;i++)
{
if(temp>b[i])
temp=b[i];
}
for(i=0;i<4;i++)
{
if((b[i]==temp)&&a[i]>160&&a[i]<190)
printf("%d%d",a[i],a[i+1]);
}
return0;
}
8.29验证括号是否匹配
3、输入一串字符串,其中有普通的字符与括号组成(包括‘(’、‘)’、‘[’,']'),要求验证括号是否匹配,如果匹配则输出0、否则输出1.
Smpleinput:
dfa(sdf)df[dfds(dfd)]SmpleoutPut:
0
#include
intmain()
{
chara[100],c,i=0;
intflag=0;
scanf("%c",&c);
while(c!
='\n'&&flag==0)
{
switch(c)
{
case('('):
a[i]=c;
i++;
break;
case('['):
a[i]=c;
i++;
break;
case(')'):
if(a[i-1]=='(')
{
a[i-1]='\0';
i--;
}
else
flag=1;
break;
case(']'):
if(a[i-1]=='[')
{
a[i-1]='\0';
i--;
}
else
flag=1;
break;
}
scanf("%c",&c);
}
if(a[0]!
='\0')
printf("1");
else
printf("%d",flag);
return0;
}
8.31回文数
1.判断回文数,是返回1
#include
intmain()
{
intn,m=0,temp;
scanf("%d",&n);
temp=n;
while(temp>0)
{
m*=10;
m+=temp%10;
temp=temp/10;
}
if(m==n)
printf("1");
else
printf("0");
return0;
}
8.31将第一行中含有第二行中“23”的数输出并排序
2.输入一行数字:
123 423 5645 875 186523
在输入第二行:
23
将第一行中含有第二行中“23”的数输出并排序
结果即:
123 423 186523
#include
intmain()
{
inta[100]={0},temp,s,i=0,j;
charc='\0';
intsort[100],t=0;
while(c!
='\n')
{
scanf("%d%c",&temp,&c);
a[i]=temp;
i++;
}
scanf("%d",&s);
for(j=0;j<=i;j++)
{
temp=a[j];
while(temp>0)
{
if(temp%100==s)
{
sort[t]=a[j];
t++;
break;
}
else
temp/=10;
}
}
for(i=0;ifor(j=0;jif(sort[i]{
temp=sort[i];
sort[i]=sort[j];
sort[j]=temp;
}
for(i=0;iprintf("%d",sort[i]);
return0;
}
8.31翻译电话号码
3.将 电话号码 one two 。
。
。
nine zero
翻译成1 2 。
。
9 0
中间会有double
例如输入:
OneTwoThree
输出:
123
输入:
OneTwoDoubleTwo
输出:
1222
输入:
1Two2输出:
ERROR
输入:
DoubleDoubleTwo输出:
ERROR
第三题:
有空格,非法字符,两个Double相连,Double位于最后一个单词都错误
#include
#include
intmain()
{
chara[11][11]={"zero","one","two","three","four","five","six","seven","eight","nine","double"};
chartemp[11];
charc='\0';
inti,d=0,f;//dmeansdoublefmeansfinal
while(c!
='\n')
{
scanf("%s%c",&temp,&c);
f=0;
for(i=0;i<11;i++)
{
if(!
strcmp(temp,a[i])&&i<10)
{
printf("%d",i);
f=1;
if(d==1)
{
printf("%d",i);
d=0;
}
}
elseif(!
strcmp(temp,a[i])&&i==10)
{
d=1;
f=1;
}
}
if(f==0)
break;
}
if(d==1||f==0)
printf("ERROR\n");
return0;
}
9.1.AM将整数倒序输出,剔除重复数据
输入一个整数,如12336544,或1750,然后从最后一位开始倒过来输出,最后如果是0,则不输出,输出的数字是不带重复数字的,所以上面的输出是456321和571。
如果是负数,比如输入-175,输出-571。
#include
intmain()
{
intNum,n[50],a[10]={0},temp,i=0,flag=0;
charc;//a数组是剔除重复数字falg是防止首位输出0以及保证后面0的正常输出
scanf("%c",&c);
scanf("%d",&Num);
while(Num>0)
{
temp=Num%10;
if(a[temp]==0)
{
a[temp]=1;
n[i]=temp;
i++;
}
Num/=10;
}
if(c=='-')
printf("%c",c);
for(temp=0;temp
{
if(n[temp]!
=0||flag!
=0)
{
printf("%d",n[temp]);
flag=1;
}
}
temp=((int)c-48)-n[i-1];//判断头两个数字是否一样
if(c!
='-'&&temp!
=0)
printf("%d",(int)c-48);
return0;
}
9.1.AM大数相减
输入两行字符串正整数,第一行是被减数,第二行是减数,输出第一行减去第二行的结果。
备注:
1、两个整数都是正整数,被减数大于减数
示例:
输入:
1000000000000001
1
输出:
1000000000000000
注意大数用chara[]存储,用%s接收,一位一位的运算。
注意a[0]里的正负号。
#include
#include
voiddec(char*d1,char*d2,char*out)