两个非常大的数字的乘积的第一个数字
First digit of the product of two very large numbers
有 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。
山 姆
相关文章:
- 为什么它只打印双链接列表的第一个值,而我的程序却崩溃了
- std::find,返回所有找到的值的替代方法,而不仅仅是存在重复的向量的第一个值
- 如何仅读取文本文件中的第一个值
- 在C++中,如何在第一个"system()"结束后执行第二个"system()"?
- 查找不在标准中的第一个值::设置<int>最小-最大值
- C++:忽略第一个 cin.ignore 之后的输入
- 在C++中打印多个矢量的第一个值
- C++去除前x个元素的有效方法,在不改变向量大小的情况下将第x+1个元素推到第一个
- C++第一个cout将不会打印
- 我们可以在第一个else-if条件结束后使用另一个else-if条件吗
- 我必须更改我的数字最后一个数字和第一个数字,但不要使用仅带有整数或循环的函数.例如从 12345 到 52341
- OpenGL:第二个VBO破坏了第一个VBO
- 将一个数字拆分为多个数字,每个数字只有一个有效位
- 为什么第一个Dynamic_cast没有投射到基类?
- OpenGL 2D游戏只绘制第二个精灵纹理而不是第一个
- C++ 为什么程序只读取第一个值
- 在我的第一个C++程序中需要一些帮助(简单)
- 为什么我的代码在第一个 if 语句处中断?
- 是否可以从另一个类对象调用一个类函数而不继承第一个类
- 在将字符串转换为整数后,是否有一种方法可以保持数字的第一个零