具有非常非常大数字的算术运算

arithmetic operations with a very very large numbers

本文关键字:非常 算术运算 数字      更新时间:2023-10-16

我需要编写一个执行算术运算的程序 但是我必须用非常非常大的数字来做,例如 2837456897658923563425345 + 23784623874623874682736478236

因为数字本身太大了,所以我把它们作为一个字符串保存 我只是无法弄清楚当我无法将这些数字移动到变量时如何做简单的事情,例如加减法,因为它们太大了

您不必使用诸如GNU GMP之类的外部库,但是最好使用它们。但是,您仍然可以做这样的事情。

让我们总结一下15467985611234679845178946510379845612546541238708和67467985611412679845878946783212365212043542388978。结果当然会829359712464735970057893294422108246883627686,我们可以很容易地看到这一点。(哈哈(

现在,让我们跳转到代码。首先将数字分成更小的部分。假设 5 个 10 秒并对其进行数学计算。现在让我们看看输出是怎么说的。

#include <iostream>
using namespace std;
int main()
{
long bigNumber1[5] = { 1546798561, 1234679845, 1789465103, 7984561254, 6541238708 };
long bigNumber2[5] = { 6746798561, 1412679845, 8789467832, 1236521204, 3542388978 };
long tempSum = 0;
int carry = 0;
long sum[5] = {0, 0, 0, 0, 0};
for (int i = 4; i >= 0; i--)
{
tempSum = bigNumber1[i] + bigNumber2[i] + carry;
if (i == 0)
sum[i] = tempSum;
else
sum[i] = tempSum % 1000000000;
carry = tempSum / 1000000000;
}
for (int i = 0; i < 5; i++)
cout << sum[i];
}

输出:

829359712464735970057893294422108246883627686

似乎它正在工作。 :)

但是,您仍然可以使用诸如GNU GMP之类的基本库来更轻松地实现此目的。

祝你好运,玩得开心!

方法2:由于您也要求对不同的长度数字求和。我做了一些不同的算术。

这次让我们总结一下,

15467985611234679845178946510379845612546541238708+__6746798561141267984587894678321236521204354238815535453596846092525024825457163057977758584781096

这是它的代码:

#include <iostream>
using namespace std;
int main()
{
int num1[255], num2[255], sum[255];
char s1[255], s2[255];
int l1, l2;
cin >> s1 >> s2;
for (l1 = 0; s1[l1] != ''; l1++)
num1[l1] = s1[l1] - '0';
for (l2 = 0; s2[l2] != ''; l2++)
num2[l2] = s2[l2] - '0';
int carry = 0;
int k = 0;
int i = l1 - 1;
int j = l2 - 1;
for (; i >= 0 && j >= 0; i--, j--, k++)
{
sum[k] = (num1[i] + num2[j] + carry) % 10;
carry = (num1[i] + num2[j] + carry) / 10;
}
if (l1 > l2)
{
while (i >= 0)
{
sum[k++] = (num1[i] + carry) % 10;
carry = (num1[i--] + carry) / 10;
}
}
else if (l1 < l2)
{
while (j >= 0)
{
sum[k++] = (num2[j] + carry) % 10;
carry = (num2[j--] + carry) / 10;
}
}
else
{
if (carry > 0)
sum[k++] = carry;
}
for (k--; k >= 0; k--)
cout << sum[k];
return 0;
}

输出:

15535453596846092525024825457163057977758584781096

不出所料。现在,您几乎可以对任何您想要的东西求和。我建议你理解代码。

享受吧!

你可能想使用一个bignum库 - 例如GNU GMP。

C++可以处理相当大的数字 - 足以满足大多数目的。但是对于大于本机类型可以处理C++数字,您要么需要编写自己的代码来对这些类型进行数学运算,要么仅使用现有库(推荐(。