C++で大きな数値入力を処理する最良の方法は何ですか(たとえば、10^100
)?
アルゴリズムの場合、私は通常Rubyに切り替え、文字列を使用することもあります。
他の良い方法はありますか?
オーウェン・アストラチャンによる C++。pdf の大整数のケーススタディをご覧ください。このファイルは、詳細な紹介とコードの実装に非常に役立ちました。サードパーティのライブラリは使用しません。私はこれを使用して、(vector<char>
を格納するのに十分なメモリがある限り)問題なく巨大な数を処理しました。
Idea:大きな整数をvector<char>
に格納することにより、任意精度の整数クラスを実装します。
vector<char> myDigits; // stores all digits of number
次に、<<, >>, +, -, *, ==, <, !=, >, etc.
を含む、big intに関連するすべての操作は、このchar array
の操作に基づいて実行できます。
コードの味:これはヘッダーファイルです。pdfファイルでコード付きのcppを見つけることができます。
#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);
受け取った大量の入力に対して操作を実行する方法を探していますか? 大きな整数のC++ ライブラリ(Javaに類似)があり、算術演算を実行できます。
目的のために独自のコードを作成したい場合は、文字列を使用して大きな数値を格納してみてください...次に、それらに+-/ *のような基本的な操作を作成できます...たとえば-
#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;
}
正確にしたい場合は、大きな数を処理するために作成されたライブラリが必要です。 JavaにはBigIntがあり、桁数に関係なく常に正確であり、数学演算を提供します。すべてのソースコードが含まれているので、転送できますが、これは実際には、C++が得意とする種類のものではありません。私は、JVMベースの言語を使用し、Bigライブラリの1つを使用します。
低速にしたい場合を除いて、これにRubyを使用することはないと思います。また、C++について話しているので、速度は設計上の考慮事項の一部であると思います。
数値の入力について話していると仮定すると、倍精度では最大1.7976931348623157 x 10 ^ 308になります。
CおよびC++用の任意精度の数値処理ライブラリである gmplib を参照することをお勧めします。
他の人がすでに指摘しているように、C++にはさまざまなbignum /任意精度ライブラリがあり、役立つと思われます。速度が必要ない場合、私はPythonとLISPの両方がデフォルトでbignumを使用しているという印象を受けています。