华为C语言Word下载.docx
- 文档编号:21906933
- 上传时间:2023-02-01
- 格式:DOCX
- 页数:15
- 大小:23.41KB
华为C语言Word下载.docx
《华为C语言Word下载.docx》由会员分享,可在线阅读,更多相关《华为C语言Word下载.docx(15页珍藏版)》请在冰豆网上搜索。
switch的参数不能为实型。
上海华为的一道关于指针方面的编程题
intA[nSize],其中隐藏着若干0,其余非0整数,写一个函数intFunc(int*A,intnSize),使A把0移至后面,非0整数移至
数组前面并保持有序,返回值为原数据中第一个元素为0的下标。
(尽可能不使用辅助空间且考虑效率及异常问题,注释规范且给出设计思路)
华为笔试题含答案[软件工程题]
写一个程序,要求功能:
求出用1,2,5这三个数不同个数组合的和为100的组合个数。
如:
100个1是一个组合,5个1加19个5是一个组合。
。
请用C++语言写。
答案:
最容易想到的算法是:
设x是1的个数,y是2的个数,z是5的个数,number是组合数
注意到0<
=x<
=100,0<
=y<
=50,0<
=z=20,所以可以编程为:
number=0;
for(x=0;
x<
=100;
x++)
for(y=0;
y<
=50;
y++)
for(z=0;
z<
=20;
z++)
if((x+2*y+5*z)==100)
number++;
cout<
<
number<
endl;
上面这个程序一共要循环100*50*20次,效率实在是太低了
事实上,这个题目是一道明显的数学问题,而不是单纯的编程问题。
我的解法如下:
因为x+2y+5z=100
所以x+2y=100-5z,且z<
=20x<
=100y<
=50
所以(x+2y)<
=100,且(x+5z)是偶数
对z作循环,求x的可能值如下:
z=0,x=100,98,96,...0
z=1,x=95,93,...,1
z=2,x=90,88,...,0
z=3,x=85,83,...,1
z=4,x=80,78,...,0
......
z=19,x=5,3,1
z=20,x=0
因此,组合总数为100以内的偶数+95以内的奇数+90以内的偶数+...+5以内的奇数+1,
即为:
(51+48)+(46+43)+(41+38)+(36+33)+(31+28)+(26+23)+(21+18)+(16+13)+(11+8)+(6+3)+1
某个偶数m以内的偶数个数(包括0)可以表示为m/2+1=(m+2)/2
某个奇数m以内的奇数个数也可以表示为(m+2)/2
所以,求总的组合次数可以编程为:
for(intm=0;
m<
m+=5)
{
number+=(m+2)/2;
}
这个程序,只需要循环21次,两个变量,就可以得到答案,比上面的那个程序高效了许多
倍----只是因为作了一些简单的数学分析
这再一次证明了:
计算机程序=数据结构+算法,而且算法是程序的灵魂,对任何工程问
题,当用软件来实现时,必须选取满足当前的资源限制,用户需求限制,开发时间限制等种
种限制条件下的最优算法。
而绝不能一拿到手,就立刻用最容易想到的算法编出一个程序了
事——这不是一个专业的研发人员的行为。
那么,那种最容易想到的算法就完全没有用吗?
不,这种算法正好可以用来验证新算法
的正确性,在调试阶段,这非常有用。
在很多大公司,例如微软,都采用了这种方法:
在调
试阶段,对一些重要的需要好的算法来实现的程序,而这种好的算法又比较复杂时,同时用
容易想到的算法来验证这段程序,如果两种算法得出的结果不一致(而最容易想到的算法保
证是正确的),那么说明优化的算法出了问题,需要修改。
可以举例表示为:
#ifdefDEBUG
intsimple();
#endif
intoptimize();
inafunction:
result=optimize();
ASSERT(result==simple());
这样,在调试阶段,如果简单算法和优化算法的结果不一致,就会打出断言。
同时,在程
序的发布版本,却不会包含笨重的simple()函数。
——任何大型工程软件都需要预先设计良
好的调试手段,而这里提到的就是一种有用的方法。
一个学生的信息是:
姓名,学号,性别,年龄等信息,用一个链表,把这些学生信息连在一起,给出一个age,在些链表中删除学生年龄等于age的学生信息。
#include"
stdio.h"
conio.h"
structstu{
charname[20];
charsex;
intno;
intage;
structstu*next;
}*linklist;
structstu*creatlist(intn)
inti;
//h为头结点,p为前一结点,s为当前结点
structstu*h,*p,*s;
h=(structstu*)malloc(sizeof(structstu));
h->
next=NULL;
p=h;
for(i=0;
i<
n;
i++)
{
s=(structstu*)malloc(sizeof(structstu));
p->
next=s;
printf("
Pleaseinputtheinformationofthestudent:
namesexnoage\n"
);
scanf("
%s%c%d%d"
s->
name,&
s->
sex,&
no,&
age);
p=s;
Createsuccessful!
"
return(h);
voiddeletelist(structstu*s,inta)
structstu*p;
while(s->
age!
=a)
s=s->
next;
if(s==NULL)
Therecordisnotexist."
else
next=s->
Deletesuccessful!
voiddisplay(structstu*s)
while(s!
=NULL)
%s%c%d%d\n"
name,s->
sex,s->
no,s->
intmain()
structstu*s;
intn,age;
Pleaseinputthelengthofseqlist:
\n"
%d"
&
n);
s=creatlist(n);
display(s);
Pleaseinputtheage:
deletelist(s,age);
return0;
2、实现一个函数,把一个字符串中的字符从小写转为大写。
voiduppers(char*s,char*us)
for(;
*s!
='
\0'
;
s++,us++)
if(*s>
a'
*s<
z'
)
*us=*s-32;
*us=*s;
*us='
char*s,*us;
charss[20];
Pleaseinputastring:
%s"
ss);
s=ss;
uppers(s,us);
Theresultis:
\n%s\n"
us);
getch();
随机输入一个数,判断它是不是对称数(回文数)(如3,121,12321,45254)。
不能用字符串库函数
/***************************************************************
1.
函数名称:
Symmetry
功能:
判断一个数时候为回文数(121,35653)
输入:
长整型的数
输出:
若为回文数返回值为1esle0
******************************************************************/
unsignedcharSymmetry(longn)
longi,temp;
i=n;
temp=0;
while(i)//不用出现长度问题,将数按高低位掉换
temp=temp*10+i%10;
i/=10;
return(temp==n);
}
方法一
/*---------------------------------------------------------------------------
判断字符串是否为回文数字
实现:
先将字符串转换为正整数,再将正整数逆序组合为新的正整数,两数相同则为回文数字
char*s:
待判断的字符串
无
返回:
0:
正确;
1:
待判断的字符串为空;
2:
待判断的字符串不为数字;
3:
字符串不为回文数字;
4:
待判断的字符串溢出
----------------------------------------------------------------------------*/
unsignedIsSymmetry(char*s)
char*p=s;
longnNumber=0;
longn=0;
longnTemp=0;
/*判断输入是否为空*/
if(*s==\'
\\0\'
)
return1;
/*将字符串转换为正整数*/
while(*p!
=\'
/*判断字符是否为数字*/
if(*p<
\'
0\'
||*p>
9\'
return2;
/*判断正整数是否溢出*/
if((*p-\'
)>
(4294967295-(nNumber*10)))
return4;
nNumber=(*p-\'
)+(nNumber*10);
p++;
/*将数字逆序组合,直接抄楼上高手的代码,莫怪,呵呵*/
n=nNumber;
while(n)
if((n%10)>
(4294967295-(nTemp*10)))
return3;
nTemp=nTemp*10+n%10;
n/=10;
/*比较逆序数和原序数是否相等*/
if(nNumber!
=nTemp)
方法二
先得到字符串的长度,再依次比较字符串的对应位字符是否相同
字符串不为回文数字
unsignedIsSymmetry_2(char*s)
intnLen=0;
inti=0;
/*得到字符串长度*/
nLen++;
/*长度不为奇数,不为回文数字*/
if(nLen%2==0)
/*长度为1,即为回文数字*/
if(nLen==1)
/*依次比较对应字符是否相同*/
i=nLen/2-1;
while(i)
if(*(p+i)!
=*(p+nLen-i-1))
i--;
求2~2000的所有素数.有足够的内存,要求尽量快
intfindvalue[2000]={2};
staticintfind=1;
booladjust(intvalue)
assert(value>
=2);
if(value==2)returntrue;
for(inti=0;
=find;
if(value%findvalue[i]==0)
returnfalse;
findvalue[find++];
returntrue;
华为最后三个大题
1.A,B,C,D四个进程,A向buf里面写数据,B,C,D向buf里面读数据,
当A写完,且B,C,D都读一次后,A才能再写。
用P,V操作实现。
2.将单向链表reverse,如ABCD变成DCBA,只能搜索链表一次。
3.将二叉树的两个孩子换位置,即左变右,右变左。
不能用递规(变态!
华为笔试题:
2007.03.31华为笔试题之一二
给大家说几个:
(感觉华为不过如此,虽然我的分不高,因为很多题我做给他实在是侮辱我的智商)
1。
大意如下:
38头牛中选出3头跑得最快的,使用一个每次只能供6头比赛的场地,要求用最快的方法。
(我给一个最傻瓜的答案,因为我发现一起笔试的有且恰好有38个人,不知道**什么意思?
2。
公司职员知道老板的年龄,不知道他女儿的年龄,老板3个女儿的年龄相加为13,相乘为老板年龄,且只有一个女儿的年龄大于5岁,求这4个的年龄?
(网上有一大堆答案!
3。
原题是2002年以前的一道大学生数学建模竞赛的题,是说一个学生冒雨从宿舍去食堂吃饭,200米的距离内,问是走着少淋雨还是跑着少?
(该题简化了大部分的假设,只剩下一点点问题要你解决,做着没劲!
华为最新笔试题及其分析
1.printf的输出问题
total);
//thisisright
printf(total);
//thisiswrong
hello"
//butthisisright
2.整数类型的长度
char1个子节,8位
unsignedshort[int]
[signed]shortint
short2个字节,16位
[signed]int
unsignedint
int型在vc里是4个子节,32位,也可能是16位,2个字节
long[int]
unsignedlong[int]
long型都是32位,4个字节
float32,4
double64,8
longdouble128,16
char8,一个字节,存放的实际上是字符的ascii码
3、找出错误并改正
char*my_cpy(char*src,intlen){
chardest[1024];
memcpy(dest,src,len);
returndest;
上面的函数是否有问题,如果有指出其所在,如果没有,给出函数功能描述。
数组应该初始化
memcpy不判断是否越界,所以调用前应该判断是否越界
不应该返回rest,因为这个数组是在函数内部申请的,所以函数结束之后就会消失,指针也会变成“野指针”,所以指向非法地址
最后一个比较隐蔽
char*memcpy(char*dest,constchar*src,intlen)
char*pDest=(char*)dest;
char*pSrc=(char*)src;
intpos;
for(pos=0;
pos<
len;
pos++)
pDest[pos]=pSrc[pos];
return(char*)pDest;
存在地问题就是没有判断指针是否非法assert(dest!
=NULL||src!
=NULL);
条件为FLASE显示
不调用其他函数,写一个memcpy的函数,函数原型为
void*memcpy(void*dest,void*src,size_tlength);
-----------利用好断言---------
/*memcpy───拷贝不重叠的内存块*/
voidmemcpy(void*pvTo,void*pvFrom,size_tsize)
void*pbTo=(byte*)pvTo;
void*pbFrom=(byte*)pvFrom;
ASSERT(pvTo!
=NULL&
pvFrom!
/*内存块重叠吗?
如果重叠,就使用memmove*/
ASSERT(pbTo>
=pbFrom+size||pbFrom>
=pbTo+size);
while(size-->
0)
*pbTo++==*pbFrom++;
return(pvTo);
-----------------------
常见函数编程:
char*strcpy(char*strDest,constchar*strSrc)
ASSERT(strDest!
strSrc!
char*addr=strDest;
while(*strDest++=*strSrc++)
NULL;
//NULL可以省略,但更有利于编译器发现错误
returnaddr;
void*memcpy(void*dest,constvoid*src,intcount)
ASSERT(dest!
src!
i<
cout;
i++)
dest=src;
intstrcmp(constchar*str1,constchar*str2)
while(str1!
str2!
=NULL)
if(*str1<
*str2)return-1;
elseif(*str1>
*str2)return1;
else{str1++;
str2++;
if(str1==NULL&
return-1;
elseif(str1!
str2==NULL)
elsereturn0;
//way2:
morecompact
inti=strlen(str1);
intj;
for(j=0;
j<
=i;
j++)
if(str1[j]>
str2[j])return1;
//ifstr2terminates,thenstr2[j]=0,str1[j]>
str2[j],return1;
elseif(str1[j]<
str2[j])return-1;
elseif(str1[j]=='
'
)return0;
//way3:
optimize
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 华为 语言