Каков наилучший способ обработки больших числовых входов в C++ (например, 10^100
)?Обработка больших чисел в C++?
Для алгоритмов я обычно переключаюсь на ruby, и иногда я использую строки.
Любые другие хорошие методы?
Каков наилучший способ обработки больших числовых входов в C++ (например, 10^100
)?Обработка больших чисел в C++?
Для алгоритмов я обычно переключаюсь на ruby, и иногда я использую строки.
Любые другие хорошие методы?
если вы говорите о вводе цифр, двойная точность будет получить до +1,7976931348623157 х 10^308
Вы ищете, как выполнять операции на больших входах, которые вы получаете? Существует big integer C++ библиотека (по аналогии с Java), что позволяет выполнять арифметические операции ...
Вы можете взглянуть на gmplib, произвольную точность обработки номер библиотеки для C и C++
Если вы хотите, чтобы это было точно, вам нужна библиотека, предназначенная для обработки больших чисел. Java имеет BigInt, который всегда будет точным, независимо от того, сколько цифр вы хотите принять, и предоставляет математические операции над ними. Весь исходный код включен, вы можете его перенести, но это действительно не тот тип, на котором лучше всего работает C++. Я использую язык на основе JVM и использую одну из больших библиотек.
Я не думаю, что я использовал бы рубин для этого, если вы не хотите, чтобы он был медленным, и я предполагаю, что, поскольку вы говорите о C++, скорость - это часть рассмотрения дизайна.
Как уже отмечалось, в C++ существуют различные библиотеки бинарной/произвольной точности, которые вы, вероятно, найдете полезными. Если скорость не нужна, у меня создается впечатление, что Python и Lisp по умолчанию используют бонусы.
Это верно для Лисо. Если я делаю bignum stuff, я рулон с Lisp. :) – 2008-10-30 16:10:18
Если вы хотите сделать свой собственный код с целью попытаться использовать строки для хранения больших чисел ... вы можете создать основные опа как + -/* на них ... к примеру -
#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
введенных строк не имеет значения для программирования для компилятора до тех пор, пока логика не будет прекрасной.
Отъезд 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);
Я попытался немного разъяснить. Не стесняйтесь исправить меня, если я неверно истолковал – 2008-09-22 20:36:19
спасибо, сэр. спасибо за библиотеку .. но я хотел бы знать, есть ли в любом другом методе doin it ?. я имею в виду, не используя конкретные stl для него .. Я использовал связанный список !! – kasperasky 2008-09-23 04:00:35