两个非常大的数字

时间:2016-06-07 14:54:17

标签: c++ math integer-overflow

有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,这显然是错误的。我希望找到一条出路。

3 个答案:

答案 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。

萨姆