给定x = 1000位且y = 500位,x + y和xy是多少?

时间:2013-10-18 23:14:51

标签: algorithm

给定x = 1000位且y = 500位,最长x + y和xy是多少?

仅供参考:对于x + y和750k,答案不应该是1500,这就是为什么我感到困惑:(

4 个答案:

答案 0 :(得分:3)

如果 x 的长度介于0和1000位之间,则 x 的值介于0和2 1000 -1之间。类似地,0≤ y < 2 500

因此,0≤ x + y ≤2 1000 + 2 500 - 2< 2 1001 ,所以 x + y 的长度最多为1001。

类似地,0≤ xy < 2 1500 xy 的长度最多为1500。

答案 1 :(得分:1)

将其视为给定0-99之间的数字,并添加数字0-9,您最多需要多少位数? 3(2 + 1)。如果你有一个数字0-9999并且你添加一个数字0-99,你将需要最多5位数(4 + 1)。请注意它是最大数字的位数加一。所以答案是1001。

答案 2 :(得分:0)

考虑2位数。在最糟糕的情况下,你可以得到:

11b + 11b = 110b 

因此3位就足够了,而不是2 + 2.对于最多N的数字,您需要ceil(log(N))位(其中log表示与基数2对数)。因此,如果您最多有两个数字N且最多M,则需要ceil(log(N+M))位。

对于乘法,请考虑3位数:

111b * 111b = 110001b

这就是为什么它也不是参数位数的简单乘法。与上面的乘法类似,您需要ceil(log(N*M))位。

答案 3 :(得分:0)

答案取决于您希望如何处理溢出(以及如何定义函数+*)。

让我们采用符号var:bitwidth来表示变量具有位宽位。这意味着你有以下声明,

x:1000
y:500

此外,我们采用这些以bigendian顺序存储的惯例(最右边的位是最小位,最左边是最大位)。我们很快得出结论,x+y需要1001来处理溢出位,即

z0:1000, z1:1001
z0 = x + y //overflow possible, ex: x=2^1000-1, y=1
z1 = x + y //overflow not possible

乘法更难,考虑a:8b:8,最广泛的结果是什么?

a:8, b:8
a = 11111111b //= 255
b = 11111111b //= 255
a * b == 1111111000000001 //=65025
//16 bits

似乎可以合理地预期乘法所需的位数是位的总和,除非你想要一个溢出位用于乘法溢出。

x:1000, y:5000
z:1500
z2:1499
z = x * y //would not have overflow
z2 = x * y //could have overflow

所有这些说,普通的微处理器只使用较大的宽度(:1000),并且丢弃溢出或设置溢出位。答案是:1000:1000:1