30. }
31.}
题目三、编写“长整数相乘”的程序,实现两个任意长度的长整数(正数)相乘,输出结果
这题就不多逼逼了,网上多的是答案。
[
1.#include
2.using namespace std;
3.int multiply (string ma,string mb,string &strRst)
4.{
5. string chengshuA = ma;
6. string chengshuB = mb;
7. unsigned long a = chengshuA.length();
8. unsigned long b = chengshuB.length();
9. int strRst_length = 0;
10. unsigned long c = (a+1)*(b+1);
11. int *p = new int[c];
12. int *pA = new int[a];
13. int *pB = new int[b];
14. if ((a == 0) || (b == 0))
15. return -1;
16. for (int i = 0; i !
= c; i++)
17. p[i] = 0;
18. for (string:
:
size_type index = 0; index !
= chengshuA.length(); index++)
19. pA[a-1-index] = chengshuA.at(index) - '0';
20. for (string:
:
size_type index = 0; index !
= chengshuB.length(); index++)
21. pB[b-1-index] = chengshuB.at(index) - '0';
22. for (int temp_b = 0; temp_b !
= b; temp_b++)
23. {
24. for (int temp_a = 0; temp_a !
= a; temp_a++)
25. {
26. int temp = p[temp_a+temp_b] + pA[temp_a]*pB[temp_b];
27. p[temp_a+temp_b] = temp % 10;
28. int carry = temp/10;
29. int x = temp_a + temp_b +1;
30. while(carry !
= 0)
31. {
32. p[x] = p[x] + carry%10;
33. carry = carry/10;
34. x++;
35. }
36. }
37. }
38. while (c-- > 0)
39. {
40. if (p[c] !
= 0)
41. {
42. strRst_length = c + 1;
43. break;
44. }
45. }
46. char ch;
47. for (int i = strRst_length - 1; i >= 0 ; i--)
48. {
49. ch = p[i] + '0';
50. strRst.push_back(ch);
51. }
52. if (strRst.empty())
53. {
54. strRst = "0";
55. }
56. return 0;
57.}
58.int main(void)
59.{
60. string a ;
61. string b ;
62. while (cin >> a>>b){
63. string strRst = "\0";
64. multiply (a,b,strRst);
65. cout << strRst<66. }
67. return 0;
68.}
二.华为机试题目+解答+自己不足+提升
题目一、給一个十进制数,输出其二进制第一个1所在的位置
这个题目没截下来,大概意思就是这个。
首先就是要把十进制转成二进制。
由于长时间没接触算法,当时我就懵逼了。
还好后来我机智(此处省略机智的过程300字。
。
。
。
)
算法如下:
if(x<=0)
return-1;
inta[40]={0};
inti;
for(i=0;x>0;i++)
{
a[i]=x%2;
x/=2;
}
for(i--;i>=0;i--)//fortest
printf("%d",a[i]);
cout<首先如果给的是负数或者小数什么的要进行输入判定,我这里就判定了负数(我觉得第一题没得满分就是忽略了小数判定)然后正式开始将十进制转为二进制。
数组a[40]用于存储二进制,其中a[0]是二进制的第0位。
x是我输入的整数,将x不停地对2取余,余数就是对应的2进制位。
比如x=12,第一次12对2取余余数为0商为6,那么0就是12的二进制第0位,存至a[0]中,第二次就对6取余余数为2,存到a[1]中,以此类推了。
最终得到a[0]、a[1]、a[2]。
。
。
。
。
便是二进制的0,1,2......位。
我不放心,输出测试一下。
之后就简单了,输出a数组中从小到大第一个值为1的i值即可。
值得注意的是,这种题其实写在一个main函数里就够了,而且这样写也比较好。
毕竟机试不是做项目,不需要模块化,这样修改起来也比较容易。
题目二、
宝宝表示这道题其实不难,就是两个字,复杂。
我的思路大概就是
1.首先判断所给矩形是否相交,不相交直接输出0
2.若相交,将相交面积表示出来,并输出结果
最后发现貌似判断相交的思路会影响相交求面积的思路(正所谓数学题多问,第一问为第二问做铺垫一样)由于我的判相交思路不好影响了第二问,导致这一题我没做出来。
思路大概是求出两个矩形中心坐标,用平行于坐标轴的线段连接两个中心,平行于x轴的线段长度若记为cenX,另一个记为cenY,我就判断cenX,Y与两矩形边长的关系。
做完后才发现对第二问毫无帮助,炸了。
。
。
。
。
。
。
浴室这一题200分我得了不到100分。
。
。
。
。
(没代码)
题目三、
这道题其实没怎么做出来,就不好说什么。
。
。
。
。
。
下面是这道题正解的源码:
#include
#include
#include
usingnamespacestd;
intnum[400][400];
intlen[400][400];
intmax(inta,intb)
{
if(a>b)
returna;
else
returnb;
}
intmain()
{
intm,n;
scanf("%d%d",&m,&n);
for(inti=1;i<=m;i++)
{
len[i][0]=0;
for(intj=1;j<=n;j++)
{
len[0][j]=-1;
scanf("%d",&num[i][j]);
if(num[i][j])len[i][j]=len[i][j-1]+num[i][j];
elselen[i][j]=0;
}
}
stackS;
intans=0,tmp;
for(intj=n;j>0;j--)
{
intW,L;
tmp=0;
if(ans>=j*m)
break;
S.push(0);
for(inti=1;i<=m;i++)
{
if(len[i][j]>len[S.top()][j]){S.push(i);}
else
{
while(!
S.empty()&&len[i][j]<=len[S.top()][j])
{
L=S.top();
S.pop();
intp=S.top();
W=(i-p-1);
tmp=max(tmp,W*len[L][j]);
}
S.push(i);
}
}
intLL;
if(!
S.empty())LL=S.top();
while(!
S.empty())
{
L=S.top();
S.pop();
intp=S.top();
if(p)W=(LL-p);
else{W=LL;S.pop();}
tmp=max(tmp,W*len[L][j]);
}
ans=max(tmp,ans);
}
printf("%d\n",ans);
return0;
}
三.华为挑战赛(也是模拟机试)
题目一、
这种第一题摆明了是送分题,不好说什么,有一点编程底子的10分钟内都能做出来
#include
#include
usingnamespacestd;
intmain()
{
intm,n;
inti,j;
inttemp;
boolflag;
cin>>m>>n;
for(i=m;i<=n;i++)
{
flag=true;;
temp=(int)sqrt(i);
for(j=2;j<=temp;j++)
{
if(i%j==0)
flag=false;
}
if(flag==true)
cout<
}
return0;
}
题目二、
卧槽,这道题我要吐槽。
因为一些原因和问题,导致这道题占用了我整个考试3/4多的时间,这也明显是我的不足,此处进行自我检讨和总结。
Point:
输入输出(这里是我的薄弱项!
)
这也是这道题最主要的内容和考察点。
其实题目本身算法不难,对输入的每一个数,遍历输入的每一个数,统计被整除的次数count,只要count>=2就是结果输出。
那么接下来问题来了:
1.计算机如何接受这些输入,因为有要求以“,”为分隔符
因为有“,”,作为字符存在,又不限制输入的具体个数,所以无法用int数组接收这些输入,此处应选择C++字符串stringstr;作为接收输入。
那么很明显,本题对C++字符串是一个考察点,并且考察重要程度甚至大于这道题的算法本身。
2.如何在一个str中取得这些数字
毫无疑问考察应试者的字符串处理能力。
我先想的是以逗号为分隔符,由于C++字符串可以以下标取出值(如str[i]),取得每一个逗号的位置,后一个减前一个得到中间的数字。
然后发现str.substr()函数会连逗号一起取出,所以这不是一个可取的方法,更不是一个好方法。
好的处理方法应该是这样,如下:
chara[10];
intp=0;
intnum[N];
inti,j,cnt=0;
[cpp]viewplaincopy
pre">cin>>str;
for(i=0;i{
if(str[i]==',')//是逗号,a[p]置为'\0',此时的数组a就存了我需要的数
{
a[p]='\0';
num[cnt++]=atoi(a);
p=0;
}
else//不是逗号,那么是数字,一位一位地存到一个字符数组a中
{
a[p++]=str[i];
}
}
a[p]='\0';
num[cnt++]=atoi(a);
总的来说,思路如下:
(召神)
以逗号为结束标志
一个字符一个字符存
存完一个之后
atoi转化为int
存到一个int数组
然后注意最后一个数字需要特殊处理(最后一个数字后面没有逗号),这样就取出了每一个数,接下来就好做了。
题目三、
该题后来知道,应用匈牙利算法。
长期没接触算法,已经不记得了,没做出来。
。
。
。
四.机试题目
题目一
第一题很简单
求一组整数中最大值和最小值之和
描述:
求一组整数中的最大值和最小值之和。
如{1,2,3},最大值为1,最小值为3,最终结果为1+3,即4
运行时间限制:
无限制
内存限制:
128MByte
输入:
一组整数(含负整数,整数个数范围为1-50)
输出:
一组整数中的最大值和最小值之和
样例输入:
1,2,3,4,5
样例输出:
6
答案提示:
当数组中只有一个整数时,则认为最大值和最小值都是它
题目二
根据来电号码显示人名
描述:
当手机来电时会根据电话号码自动匹配保存在电话本中的人名,进行电话号码匹配时一般会根据号码的后多少位进行匹配,因为不同的网络环境下发的号码可能会不同,比如,有的地区显示区号,有的可能不显示区号等。
该题目要求如下:
1)对来电号码进行后N位的匹配,N通过参数读取获得,输出所有匹配号码的人名,多个人名间加上空格
运行时间限制:
无限制
内存限制:
无限制
输入:
参数1:
int型,可能的值为0,7,8,9,当为0时需要对来电号码进行精确匹配,也就是说电话本中的号码和来电号码必须一摸一样才满足参数2:
字符串,为来电号码
输出:
匹配的人名,号码匹配失败时显示"unknown"(不包括引号)
样例输入:
709282357
样例输出:
JaneCora
答案提示:
来电的号码长度不会小于要匹配的长度电话本中号码如果小于要匹配的长度,要跳过,不进行比较匹配是从字符串后面匹配,比如号码,当进行7位匹配时,只比较后7位,也就是2345678可能需要的头文件:
#include#include#include电话号码本使用如下的数据,直接写到代码里:
typedefstruct{char*name;char*phone_num;}PHONE_BOOK;PHONE_BOOKpb[]={{"Jack",""},{"Tom","0082356"},{"Ada","056"},{"Alice",""},{"Carmen","056"},{"Frances","123"},{"Jane",""},{"Selina",""},{"Ellen",""},{"Kitty","4"},{"Cora","09282357"},{0,0},};
题目三、
机车渡口管理
描述:
某机车轮渡口,有过江车辆排队等待渡江。
过江车辆分为客车类和货车类,上船有如下规定:
同类车先到先上船,客车先于货车上船。
且每上4条客车,才允许上一辆货车;若等待的客车不足4辆,则以货车代替,若没有货车等待则允许客车都上船。
本题目为设计一个算法模拟渡口管理。
运行时间限制:
无限制
内存限制:
无限制
输入:
整数N,车辆的数量车辆类型的标识,共N辆,客车:
0,货车:
1
输出:
以输入车辆的索引作为车辆的身份标识,输出数组序列
样例输入:
500101
样例输出:
01324
五.看一下这类题目(有的题目不好理解,但理解后估计也不难)
2016/09/22一大波华为机考题目来袭
2016年09月22日22:
00:
49
阅读数:
530
今天华为在哈尔滨地区的校园招聘的简历提交截止,并且立即开展了一拨又一拨的上机笔试。
我们在外面也见证了一批又一批的题目,我就在这里记录一下。
最新鲜的是晚上的这波的第三题,是一个CD-Key生成的问题。
某软件简单实现建议的CD-Key算法。
输入3个正整数,以空格形式隔开,根据这三个正整数生成CD-Key序列。
输出的格式为:
XXXX-XXXX-XXXX-XXYY。
最后两位是前面14位的自校验,确保本身合法。
CD-Key使用的字符表为:
ABCDEFGHJKLMNPQRSTUVWXYZ。
其原理大致如下
1、输入3个32bit的正整数,按照顺序取每个正整数的低16bit,假设3个低16bit为a、b、c,将abc串联组成一个48bit的环形。
然后从低位到高位,每次取出5个bit,其数值作为下表,去字符表中查表出对应的字符,如此循环输出14个字符(注意:
第一个输出的字符应该是c的低5bit对应数字的输出字符);2、上面输出的14个字符的ASCII码求和,取低10bit,从低到高,每5个bit为下标,查表生成两个字符,即为校验位。
代码如下(欠优化):
#inclu