2008-09-22 5 views
14

Каков наилучший способ обработки больших числовых входов в C++ (например, 10^100)?Обработка больших чисел в C++?

Для алгоритмов я обычно переключаюсь на ruby, и иногда я использую строки.

Любые другие хорошие методы?

+0

Я попытался немного разъяснить. Не стесняйтесь исправить меня, если я неверно истолковал – 2008-09-22 20:36:19

+0

спасибо, сэр. спасибо за библиотеку .. но я хотел бы знать, есть ли в любом другом методе doin it ?. я имею в виду, не используя конкретные stl для него .. Я использовал связанный список !! – kasperasky 2008-09-23 04:00:35

ответ

3

если вы говорите о вводе цифр, двойная точность будет получить до +1,7976931348623157 х 10^308

6

Вы ищете, как выполнять операции на больших входах, которые вы получаете? Существует big integer C++ библиотека (по аналогии с Java), что позволяет выполнять арифметические операции ...

3

Вы можете взглянуть на gmplib, произвольную точность обработки номер библиотеки для C и C++

14

Это звучит например, вы ищете способ ввода произвольных чисел точности. вот две библиотеки, которые вы могли бы использовать: GMP и MAPM

3

Если вы хотите, чтобы это было точно, вам нужна библиотека, предназначенная для обработки больших чисел. Java имеет BigInt, который всегда будет точным, независимо от того, сколько цифр вы хотите принять, и предоставляет математические операции над ними. Весь исходный код включен, вы можете его перенести, но это действительно не тот тип, на котором лучше всего работает C++. Я использую язык на основе JVM и использую одну из больших библиотек.

Я не думаю, что я использовал бы рубин для этого, если вы не хотите, чтобы он был медленным, и я предполагаю, что, поскольку вы говорите о C++, скорость - это часть рассмотрения дизайна.

2

Как уже отмечалось, в C++ существуют различные библиотеки бинарной/произвольной точности, которые вы, вероятно, найдете полезными. Если скорость не нужна, у меня создается впечатление, что Python и Lisp по умолчанию используют бонусы.

+0

Это верно для Лисо. Если я делаю bignum stuff, я рулон с Lisp. :) – 2008-10-30 16:10:18

4

Если вы хотите сделать свой собственный код с целью попытаться использовать строки для хранения больших чисел ... вы можете создать основные опа как + -/* на них ... к примеру -

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

Ну, я думаю, что лучший способ сделать такой арифметический расчет - использовать строки. Дайте ввод как аргументы командной строки, а затем обработайте всю логику с помощью строковых функций, таких как atoi() и itoa()! Но, эй, это можно сделать для умножения и разделения? Я думаю, что таким образом strlen введенных строк не имеет значения для программирования для компилятора до тех пор, пока логика не будет прекрасной.

7

Отъезд The Large Integer Case Study in C++.pdf от Owen Astrachan. Я нашел этот файл чрезвычайно полезным с подробным представлением и реализацией кода. Он не использует стороннюю библиотеку. Я использовал это для обработки огромных чисел (если у вас достаточно памяти для хранения vector<char>) без проблем.


Идея: Он реализует произвольной точности целое класс, храня большой Int в vector<char>.

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

Тогда все операции, связанные с большим междунара, в том числе <<, >>, +, -, *, ==, <, !=, >, 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); 
Смежные вопросы