我有一个数组A
和B
,我们将数组A
的所有元素相乘,并将此值称为MulA
,类似于B
调用此值MulB
。
现在我们要比较一个更大的值,我们可以在没有实际乘以元素的情况下进行比较,因为值是10^10
的顺序而array length
是10^6
我们无法存储的CollectionType
我们的结果?
答案 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实现,我可以提供一个。感谢。