Algorithm 比较乘法运算
我有一个数组Algorithm 比较乘法运算,algorithm,numbers,Algorithm,Numbers,我有一个数组A和B,我们将数组A的所有元素相乘,让这个值称为MulA,就像我们对B所做的那样,将这个值称为MulB 现在我们要比较这些值哪个大,我们能不实际乘以元素吗,因为值的顺序是10^10,array length最多10^6我们不能存储结果吗?在C++中使用64位整数(long-long),它最多可以容纳9 x 10^18(2^63-1). 不,不相乘就无法比较两个列表乘法(乘法的模运算规则在这里不起作用) 由于该值的阶数为10^10,且数组长度高达10^6,因此我们无法 存储我们的结果
A
和B
,我们将数组A
的所有元素相乘,让这个值称为MulA
,就像我们对B
所做的那样,将这个值称为MulB
现在我们要比较这些值哪个大,我们能不实际乘以元素吗,因为值的顺序是10^10
,array length
最多10^6
我们不能存储结果吗?在C++中使用64位整数(long-long
),它最多可以容纳9 x 10^18
(2^63-1). 不,不相乘就无法比较两个列表乘法(乘法的模运算规则在这里不起作用)
由于该值的阶数为10^10,且数组长度高达10^6,因此我们无法
存储我们的结果
在最坏的情况下,相乘的值将是10^(10^7),这不能适合任何数据类型。所以你需要在这里使用大整数,它在引擎盖下以字符串的形式完成所有事情
如果C++中需要一个简单的大整数实现,我可以提供一个。谢谢。
使用64位整数(long
在C++中),它最多可以容纳9x10^18
(2^63-1)。不,不相乘就无法比较两个列表乘法(乘法的模运算规则在这里不起作用)
由于该值的阶数为10^10,且数组长度高达10^6,因此我们无法
存储我们的结果
在最坏的情况下,相乘的值将是10^(10^7),这不能适合任何数据类型。所以你需要在这里使用大整数,它在引擎盖下以字符串的形式完成所有事情
如果C++中需要一个简单的大整数实现,我可以提供一个。谢谢。
为了避免大的乘积,您可以比较日志的总和:sum(a中a的日志a)
和sum(b中b的日志b)
。这是因为(a1*a2*a3*…*an)=exp(log(a1)+log(a2)+…+log(an))
,而exp
是一个递增函数
这将引入一些数字错误(因为log
不完全是可计算的),但在实践中,除非产品彼此非常接近,否则它会工作得很好
注意,这在乘积很大的情况下有效,在乘积很小的情况下也有效(例如,如果元素是概率)。为了避免出现大乘积,您可以比较日志的总和:
sum(a中a的log a)
到sum(b中b的log b)
。这是因为(a1*a2*a3*…*an)=exp(log(a1)+log(a2)+…+log(an))
,而exp
是一个递增函数
这将引入一些数字错误(因为log
不完全是可计算的),但在实践中,除非产品彼此非常接近,否则它会工作得很好
请注意,这在产品很大的情况下有效,在产品很小的情况下也有效(例如,如果元素是概率)。为什么不使用
int64\t
?其最大值为922372036854775807,大于9×10⁸.您没有提到重要的事情-元素的类型是什么?为什么不使用int64\t
?其最大值为922372036854775807,大于9×10⁸.你们并没有提到重要的事情-什么是元素的类型?我更新了我的答案。顺便说一下,检查了OP的配置文件,发现他是一个C++风扇:P@Dukeling不。它需要10^10000000(比你的多一个),我上面提到:)和(10^10)(10^6)与你提到的10^1000000不一样。我更新了我的答案。顺便说一下,检查了OP的配置文件,发现他是一个C++风扇:P@Dukeling不。它需要10^10000000(比你的多一个),我上面提到:)和(10^10)(10^6)与你提到的10^1000000不一样。