大家来看看华为的二面题.答对了基本上进华为没问题了!
原题:
求两个数组的整数乘法,即a,b两个数组都是两个正整数.数组的低位a[0],b[0]为整数的个位,以此类推。数组长度为30。
(提示:这道题没有啥提示信息(考的全是潜在的东西),它是二面题,大家研究研究,传说考了很多内容.看看你的思维水平.过了基本上就通过了.哈哈)
问题点数:20、回复次数:28Top
1 楼windcsn(向所有的朋友学习!)回复于 2005-08-18 08:50:00 得分 0
不想进华为Top
2 楼younggle(洋溢)回复于 2005-08-18 08:56:03 得分 0
像小学的时候立一个竖式算一算就行了。
一样的道理。Top
3 楼singohwang(Pro.X)回复于 2005-08-18 08:59:59 得分 0
晕死!Top
4 楼zzfly82(阿飞)回复于 2005-08-18 09:17:43 得分 0
呵呵,不要以前题真的很简单,写个C算法出来看看呀,暗藏杀机呀!!Top
5 楼wshcdr(dd)回复于 2005-08-18 09:24:07 得分 0
把两个数组分别读进两个__64类型的数
两数相乘
最后把结果用数组显示
Top
6 楼nlstone(天外流星)回复于 2005-08-18 09:43:34 得分 0
算竖式或如楼上所说,均正解,so easy的题目Top
7 楼fdsfdsfsdf53()回复于 2005-08-18 11:03:32 得分 0
用传说中的高精度乘法不就可以解决了吗?做过Top
8 楼nanfeng231(木木)回复于 2005-08-18 11:10:53 得分 0
大数乘法,怎么会问这样的问题呢!Top
9 楼lovelife_821106(明天吧)回复于 2005-08-18 12:11:12 得分 1
用数组保存中间结果和最终结果Top
10 楼YanDong_8212(谢科)回复于 2005-08-18 12:31:09 得分 1
面试主要看基础,做不做得出来并不是关键。
Top
11 楼xiaodongdehome(骆驼 Msn : greatcampo@hotmail.com)回复于 2005-08-18 17:23:59 得分 1
写一个有 局限性 的算法:
--- 局限在 该算法 中 数组的个数 最多为 ((UINT)0xffffffff / 81) 个;
--- 当然也可以改进成 不局限 个数的算法.
UINT a[30], b[30];
UINT t[30]; //临时结果
UINT r[60]; //存放结果
::ZeroMemory(r, 60 * sizeof(int));
for(int i=0; i<30; i++)
{
::ZeroMemory(t, 30 * sizeof(int));
for(int j=0; j<30; j++)
{
t[j] = a[i] * b[j];
}
for(int k=0; k<30; k++)
{
r[i + k] += t[k];
}
}
for(int i=0; i<59; i++)
{
r[i + 1] += r[i] / 10;
r[i] = r[i] % 10;
}Top
12 楼xiaodongdehome(骆驼 Msn : greatcampo@hotmail.com)回复于 2005-08-18 17:58:47 得分 5
改进的:
const UINT MAXSIZE = 30; // 可已任意设置
BYTE a[MAXSIZE], b[MAXSIZE];
BYTE t[MAXSIZE]; //临时结果
BYTE r[MAXSIZE * 2]; //存放结果
::ZeroMemory(r, MAXSIZE * 2 * sizeof(BYTE));
for(BYTE i=0; i<MAXSIZE; i++)
{
for(BYTE j=0; j<MAXSIZE; j++)
{
t[j] = 0;
t[j] = a[i] * b[j];
ASSERT(t[j] > = 0);
ASSERT(t[j] <= 81);
}
for(BYTE k=0; k < MAXSIZE; k++)
{
r[i + k] += t[k];
r[i + k + 1] += r[i + k] / 10;
r[i + k] = r[i + k] % 10
}
}Top
13 楼sbnth(金鳞岂非池中物,一遇风云便化龙)回复于 2005-08-18 19:16:35 得分 0
too easy,没意思啊Top
14 楼alec626(月吻长河Blog:spaces.msn.com/filebase)回复于 2005-08-20 17:53:59 得分 0
怎么不考除法?
乘法也太直接了吧Top
15 楼lianglp(寻找黄金分割点)回复于 2005-08-20 18:18:08 得分 0
呵呵,华为有这么好吗!Top
16 楼lianglp(寻找黄金分割点)回复于 2005-08-20 18:25:35 得分 0
unsigned __int64 nResult = 0;
_strrev(a_array);
_strrev(b_array);
nResult = strto64(a_array) * strto64(b_array);
搞定了。
Top
17 楼alphapaopao(炮炮)回复于 2005-08-21 14:56:13 得分 0
有什么大不了的呢?Top
18 楼superpingl(赖平)回复于 2005-08-21 15:15:40 得分 2
做对题目不是关键
关键是你做对题目的方式
这个题目可以有很多种方法解决
不要把这样的题目看成考试,答案不是唯一的。Top
19 楼xialin168(林)回复于 2005-08-21 19:55:49 得分 1
算法最重要Top
20 楼w7x(舍我其谁)回复于 2005-08-22 09:48:56 得分 1
以前我写过,任意长度因式相乘,用数组保存结果。Top
21 楼foxqwx(努力学习C/C++)回复于 2005-08-22 16:03:26 得分 1
答案不重要,关键看解题思路和过程Top
22 楼dirdirdir3(风)回复于 2005-08-22 20:21:40 得分 0
_64的可能会溢出吧,30位的整数应该大于_int32的。两个相乘的话可能超Top
23 楼dirdirdir3(风)回复于 2005-08-22 20:26:38 得分 2
是比较简单,要考也考个30000个数以上的,考最小时间,呵呵。Top
24 楼gohappy_1999(碧水蓝天)回复于 2005-08-22 22:23:16 得分 0
溢出的问题怎么解决Top
25 楼dirdirdir3(风)回复于 2005-08-22 22:32:36 得分 1
用数组来做。Top
26 楼xiaodongdehome(骆驼 Msn : greatcampo@hotmail.com)回复于 2005-08-23 11:49:04 得分 2
欠套一次循环, 理论上不会出现溢出 的算法
{
const UINT MAXSIZE = 3000; // 可已任意设置
BYTE a[MAXSIZE], b[MAXSIZE];
BYTE t[MAXSIZE]; //临时结果
BYTE r[MAXSIZE * 2]; //存放结果
::ZeroMemory(r, MAXSIZE * 2 * sizeof(BYTE));
for(BYTE i=0; i<MAXSIZE; i++)
{
for(BYTE j=0; j<MAXSIZE; j++)
{
t[j] = 0;
t[j] = a[i] * b[j];
ASSERT(t[j] >= 0);
ASSERT(t[j] <= 81);
//
r[i + j] = r[i + j] + t[j];
r[i + j + 1] = r[i + j + 1] + r[i + j] / 10;
r[i + j] = r[i + j] % 10;
}
}
}Top
27 楼xiaodongdehome(骆驼 Msn : greatcampo@hotmail.com)回复于 2005-08-23 12:30:33 得分 0
o, 搞笑了!
把 两次循环里的 BYTE 改成 UINT, 就 OK 了!
^_^!Top
28 楼koskinen(因果关系)回复于 2005-08-23 15:06:33 得分 2
用数组,算出高位分配一个内存保存,考的是思维Top




