Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 比较乘法运算_Algorithm_Numbers - Fatal编程技术网

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不一样。