2017-08-12 58 views
-4

我需要编写执行算术运算 程序运算,但我有一个非常非常大的数字,这样做例如 2837456897658923563425345 + 23784623874623874682736478236C++ - 一个非常非常大的数字

由于数字本身这么大,我把它们保存为一个字符串 我只是无法弄清楚当我无法将这些数字移动到变量时,我可以如何进行简单的加减操作,因为它们太大了

+1

建议您尝试解决问题 – Gabriel

+3

您可以使用多个第三方库来处理_big整数_。 – user0042

+1

你这样做的方式,你在小学教,一次一个数字。如果将数字向后存储,它变得更简单。 – molbdnilo

回答

1

您不必使用外部库(如GNU GMP),但使用它们会更好。但是,你仍然可以做这样的事情。

让我们和15467985611234679845178946510379845612546541238708和67467985611412679845878946783212365212043542388978.结果当然会829359712464735970057893294422108246883627686的,我们可以看到,很容易。 (lol)

现在,让我们跳转到代码。首先将数字分成更小的部分。让我们说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 +__67467985611412679845878946783212365212043542388 15535453596846092525024825457163057977758584781096

下面是它的代码:

#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] != '\0'; l1++) 
     num1[l1] = s1[l1] - '0'; 

    for (l2 = 0; s2[l2] != '\0'; 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 

如预期。现在你几乎可以得到任何你想要的东西。我建议你理解代码。

享受它!

+0

谢谢,但如果数字不对称呢?说,我不能均匀地将它们分成少量的10个10? – user8093201

+0

@ user8093201我正在为此编写代码。坚持下去。它几乎可以处理任何数字。 –

+0

@ user8093201检查方法2.这一次它几乎适用于任何你放入的东西。享受它。 如果这回答你的问题,不要忘记按我的答案旁边的勾号图标。它会将问题标记为已回答。 –

0

您可能想要使用一个bignum库 - 例如GNU GMP

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