处理大量的C ++?(Handling large numbers in C++?)

2019-06-17 14:16发布

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

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

什么其他好的方法呢?

Answer 1:

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



Answer 2:

退房++,PDF大整数案例研究用C欧文阿斯特拉罕。 我发现这个文件,详细介绍和代码实现是非常有用的。 它不使用任何第三方库。 (只要你有足够的内存来存储我已经使用这个来处理庞大的数字vector<char> ),没有任何问题。


想法 :这通过在存储大INT实现一个任意精度的整数类vector<char>

vector<char> myDigits; // stores all digits of number

然后涉及到大INT,包括所有的操作<<, >>, +, -, *, ==, <, !=, >, etc. ,可以在此基础上的操作来完成char array


代码的味道 :这里是头文件,你可以找到它的CPP与在PDF文件中的代码。

#include <iostream>
#include <string> // for strings
#include <vector> // for sequence of digits
using namespace std;

class BigInt
{
public:
    BigInt(); // default constructor, value = 0
    BigInt(int); // assign an integer value
    BigInt(const string &); // assign a string
    // may need these in alternative implementation
    // BigInt(const BigInt &); // copy constructor
    // ~BigInt(); // destructor
    // const BigInt & operator = (const BigInt &);
    // assignment operator
    // operators: arithmetic, relational
    const BigInt & operator += (const BigInt &);
    const BigInt & operator -= (const BigInt &);
    const BigInt & operator *= (const BigInt &);
    const BigInt & operator *= (int num);
    string ToString() const; // convert to string
    int ToInt() const; // convert to int
    double ToDouble() const; // convert to double
    // facilitate operators ==, <, << without friends
    bool Equal(const BigInt & rhs) const;
    bool LessThan(const BigInt & rhs) const;
    void Print(ostream & os) const;
private:
    // other helper functions
    bool IsNegative() const; // return true iff number is negative
    bool IsPositive() const; // return true iff number is positive
    int NumDigits() const; // return # digits in number
    int GetDigit(int k) const;
    void AddSigDigit(int value);
    void ChangeDigit(int k, int value);
    void Normalize();
    // private state/instance variables
    enum Sign{positive,negative};
    Sign mySign; // is number positive or negative
    vector<char> myDigits; // stores all digits of number
    int myNumDigits; // stores # of digits of number
};

// free functions
ostream & operator <<(ostream &, const BigInt &);
istream & operator >>(istream &, BigInt &);
BigInt operator +(const BigInt & lhs, const BigInt & rhs);
BigInt operator -(const BigInt & lhs, const BigInt & rhs);
BigInt operator *(const BigInt & lhs, const BigInt & rhs);
BigInt operator *(const BigInt & lhs, int num);
BigInt operator *(int num, const BigInt & rhs);
bool operator == (const BigInt & lhs, const BigInt & rhs);
bool operator < (const BigInt & lhs, const BigInt & rhs);
bool operator != (const BigInt & lhs, const BigInt & rhs);
bool operator > (const BigInt & lhs, const BigInt & rhs);
bool operator >= (const BigInt & lhs, const BigInt & rhs);
bool operator <= (const BigInt & lhs, const BigInt & rhs);


Answer 3:

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



Answer 4:

如果你想使自己的代码为宗旨尝试使用字符串来存储大的数字...那么你就可以创建基本的OPS像+ - / *对它们...例如 -

#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;
}


Answer 5:

假设你正在谈论输入数字时,双精度会得到你到1.7976931348623157×10 ^ 308



Answer 6:

你可能想看看以gmplib ,C和C的任意精度数处理库++



Answer 7:

如果你希望它是正确的,你需要作出处理大型数字图书馆。 Java有BigInt有,将永远是正确的,不管你想要多少位把它带到,并在其上提供的数学运算。 所有的源代码包含,你可以转移,但是这真的不是那种事情C ++是最好的 - 我倒是使用基于JVM的语言,并使用大的图书馆之一。

我不认为我会使用Ruby的,除非你希望它是缓慢的,和我假设,因为你是在谈论C ++,速度是有点的设计考虑。



Answer 8:

正如其他人已经指出的那样,在C ++各种BIGNUM /任意精度库,你可能会发现有用的。 如果速度是没有必要的,我的印象是,Python和Lisp语言都默认使用大数下。



Answer 9:

那么我觉得做这样的算术计算的最佳方法是使用字符串。 给输入作为命令行参数,然后使用像字符串的函数控制整个逻辑atoi()itoa() 但是,这能为乘除做哎? 我想在这样strlen进入,直到逻辑是罚款不编程重要的编译字符串。



文章来源: Handling large numbers in C++?