在C ++中处理大量数字?

时间:2020-03-06 14:33:50  来源:igfitidea点击:

在C ++中处理大型数字输入的最佳方法是什么(例如" 10 ^ 100")?

对于算法,我通常切换到ruby,有时使用字符串。

还有其他好的方法吗?

解决方案

假设我们正在谈论输入数字,则双精度将使我们达到1.7976931348623157 x 10 ^ 308

我们是否正在寻找如何对收到的大量输入执行操作?有一个很大的整数C ++库(类似于Java),可以让我们执行算术运算...

我们可能想看看gmplib,它是C和C ++的任意精度数字处理库

听起来我们正在寻找一种输入任意精度数字的方法。
这是我们可以使用的两个库:GMP和MAPM

如果我们希望它是准确的,则需要一个用于处理大数的库。 Java具有BigInt,无论我们要带多少位数,BigInt都将始终是准确的,并且可以对它们进行数学运算。包括所有源代码,我们可以传输它,但这实际上不是C ++最擅长的事情-我将使用基于JVM的语言并使用Big库之一。

除非我们希望它变慢,否则我不认为我会使用ruby,并且我假设既然我们在谈论C ++,那么速度在某种程度上是设计考虑因素。

正如其他人已经指出的那样,我们可能会发现C ++中有各种bignum /任意精度库。如果不需要速度,那么我的印象是Python和Lisp默认都使用bignums。

如果我们希望为此编写自己的代码,请尝试使用字符串存储大数字...然后,我们可以在其上创建+ / *之类的基本操作,例如-

#include <iostream>

using namespace std;

string add (string &s1, string &s2){
    int carry=0,sum,i;

    string  min=s1,
    max=s2,
    result = "";

    if (s1.length()>s2.length()){
        max = s1;
        min = s2;
    } else {
        max = s2;
        min = s1;
    }

    for (i = min.length()-1; i>=0; i--){
        sum = min[i] + max[i + max.length() - min.length()] + carry - 2*'0';

        carry = sum/10;
        sum %=10;

        result = (char)(sum + '0') + result;
    }

    i = max.length() - min.length()-1;

    while (i>=0){
        sum = max[i] + carry - '0';
        carry = sum/10;
        sum%=10;

        result = (char)(sum + '0') + result;
        i--;
    }

    if (carry!=0){
        result = (char)(carry + '0') + result;
    }       

    return result;
}

int main (){
    string a,b;

    cin >> a >> b;

    cout << add (a,b)<<endl;

    return 0;
}

好吧,我认为进行这种算术运算的最佳方法是使用字符串。将输入作为命令行参数,然后使用诸如atoi()itoa()之类的字符串函数来操纵整个逻辑!但是,嘿,可以做乘法和除法吗?我认为以这种方式输入的字符串" strlen"对于编译器的编程并不重要,除非逻辑合理。