两个非常大的数字的乘积的第一个数字

First digit of the product of two very large numbers

本文关键字:数字 第一个 非常 两个      更新时间:2023-10-16

有 2 个大整数,x 和 y,使得 z=x*y 溢出。我想计算 x 的第一个数字。直接这样做是不可能的,因为结果溢出。

我想知道是否有某种技术。

示例:1000 20579725928294522859735727575

00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
 #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=100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 y=20579725928294522859735727575

它给出输出 5 作为 z 溢出,因此 z=5240626126797720724这显然是错误的。我正在寻找摆脱这种情况的方法。

你可以用字符串做乘法,就像我多年前在学校学到的那样

123456789987654321 * 998877665544332211                    123456789987654321                  * 998877665544332211--------------------------------------                    123456789987654321                   123456789987654321                  246913579975308642                 246913579975308642                370370369962962963               370370369962962963              493827159950617284             493827159950617284            617283949938271605           617283949938271605          740740739925925926         740740739925925926        864197529913580247       864197529913580247      987654319901234568     987654319901234568   1111111109888888889+ 1111111109888888889--------------------------------------  123318230178465034444583004253633731

一般来说,结果的最高有效数字取决于所有其他数字,因此如果不确定所有其他数字,则无法确定最高有效数字。

例如,考虑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
您可以使用

Boost 的多精度库来创建足够大的整数,这些整数不会溢出。但是要弄清楚第一个数字是什么,您可以将整数转换为字符串,然后将字符串的第一个字符转换为整数。话虽如此,我不明白你为什么需要这样的东西。如果您正在处理如此大的数字,以至于对它们的计算会导致溢出,则应使用整数以外的其他内容(如 BCD 或 boost)而不是常规 int。

山 姆