有2个大整数,x和y使得z = x * y溢出。 我想计算x的第一个数字。当结果溢出时,直接这样做是不可能的。
我想知道是否有某种技术。
示例:10000000000000000000000000000000000 * 20579725928294522859735727575,这里第一个数字是2,因为我可以直接看到它,但是,除了这种特殊情况,还有办法吗?
#include <iostream>
using namespace std;
int main() {
long long int x,y,z;
cin>>x>>y;
z=x*y;
while(z>9)
{
z/=10;
}
cout<<z;
return 0;
}
以上是无效的代码。 对于 X = 10000000000000000000000000000000000 Y = 20579725928294522859735727575
它将输出5作为z溢出,因此z = 5240626126797720724,这显然是错误的。我希望找到一条出路。
答案 0 :(得分:4)
你可以将与字符串相乘,就像我多年前在学校里学到的那样
123456789987654321 * 998877665544332211 123456789987654321 * 998877665544332211 -------------------------------------- 123456789987654321 123456789987654321 246913579975308642 246913579975308642 370370369962962963 370370369962962963 493827159950617284 493827159950617284 617283949938271605 617283949938271605 740740739925925926 740740739925925926 864197529913580247 864197529913580247 987654319901234568 987654319901234568 1111111109888888889 + 1111111109888888889 -------------------------------------- 123318230178465034444583004253633731
答案 1 :(得分:1)
总的来说;结果的最高位取决于所有其他数字,因此您无法确定最高有效数字而无需确定所有其他数字。
例如,考虑3333334 * 3,其中进位将从最低有效数字一直波动到最高有效数字。
请注意,这确实是:
4 * 3 * 1
+ 3 * 3 * 10
+ 3 * 3 * 100
+ 3 * 3 * 1000
+ 3 * 3 * 10000
+ 3 * 3 * 100000
+ 3 * 3 * 1000000
..问题在于每次添加都会导致携带。
对于多位数,它会变得更糟。例如,3333334 * 31变为:
+ 4 * 1 * 1
+ 3 * 1 * 10
+ 3 * 1 * 100
+ 3 * 1 * 1000
+ 3 * 1 * 10000
+ 3 * 1 * 100000
+ 3 * 1 * 1000000
+ 4 * 3 * 10
+ 3 * 3 * 100
+ 3 * 3 * 1000
+ 3 * 3 * 10000
+ 3 * 3 * 100000
+ 3 * 3 * 1000000
+ 3 * 3 * 10000000
答案 2 :(得分:-1)
你可以使用Boost的Multiprecision Library来创建不会溢出的足够大的整数。 但是要确定第一个数字是什么,可以将整数转换为字符串,然后将字符串的第一个字符转换为整数。说过我不明白你为什么需要这样的东西。如果你正在使用如此大的数字,对它们的计算会导致溢出,你应该使用除整数之外的东西(比如BCD或boost)而不是常规的int。
萨姆