比较乘法

时间:2017-04-25 06:36:27

标签: algorithm numbers

我有一个数组AB,我们将数组A的所有元素相乘,并将此值称为MulA,类似于B调用此值MulB

现在我们要比较一个更大的值,我们可以在没有实际乘以元素的情况下进行比较,因为值是10^10的顺序而array length10^6我们无法存储的CollectionType我们的结果?

2 个答案:

答案 0 :(得分:3)

为了避免使用大型产品,您可以将日志总和进行比较:sum(log a for a in A)sum(log b for b in B)。这是因为(a1*a2*a3*...*an) = exp(log(a1)+log(a2)+...+log(an))exp是一个不断增加的功能。

这将引入一些数字错误(因为log不是完全可计算的),但它在实践中运作得很好,除非产品彼此非常接近。

注意,这既适用于产品,也适用于产品很小的情况(例如,如果元素是概率)。

答案 1 :(得分:0)

使用64位整数(C ++中的long long),它可以容纳9 x 10^18(2 ^ 63 - 1)。不,没有办法比较两个列表乘法而不乘以它们(乘法的模数算术规则在这里工作)。

  

因为值是10 ^ 10的数量级,而数组长度是10 ^ 6,所以我们不能   存储我们的结果?

在最坏的情况下,乘法值将是10 ^(10 ^ 7),这不适合任何数据类型。所以你需要在这里使用Big Integer,它可以在字幕形式下完成所有内容。

如果您需要在C ++中使用简单的Big Integer实现,我可以提供一个。感谢。