Каков наилучший способ обработки больших числовых входов на С++ (например, 10^100
)?
Для алгоритмов я обычно переключаюсь на ruby и иногда использую строки.
Любые другие хорошие методы?
Каков наилучший способ обработки больших числовых входов на С++ (например, 10^100
)?
Для алгоритмов я обычно переключаюсь на ruby и иногда использую строки.
Любые другие хорошие методы?
Похоже, вы ищете способ ввода чисел произвольной точности. вот две библиотеки, которые вы могли бы использовать: GMP и MAPM
Откажитесь от Практическое исследование с большим целым числом в С++. pdf Оуэн Астрахан. Я нашел этот файл чрезвычайно полезным с подробным представлением и реализацией кода. Он не использует стороннюю библиотеку. Я использовал это для обработки огромных чисел (если у вас достаточно памяти для хранения 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);
Вы ищете, как выполнять операции с большими входами, которые вы получаете? Существует библиотека большого числа С++ (аналогичная 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;
}
Предполагая, что вы говорите о вводе чисел, двойная точность приведет вас к 1.7976931348623157 x 10 ^ 308
Возможно, вам захочется взглянуть на gmplib, произвольную библиотеку обработки чисел точности для C и С++
Если вы хотите, чтобы он был точным, вам нужна библиотека, предназначенная для обработки больших чисел. Java имеет BigInt, который всегда будет точным, независимо от того, сколько цифр вы хотите принять, и предоставляет математические операции над ними. Весь исходный код включен, вы можете его перенести, но это действительно не тот тип, на котором лучше всего работает С++. Я использую JVM-язык и использую одну из больших библиотек.
Я не думаю, что буду использовать рубин для этого, если вы не хотите, чтобы он был медленным, и я предполагаю, что, поскольку вы говорите о С++, скорость - это часть рассмотрения дизайна.
Как уже указывали другие, в С++ есть различные библиотеки бинарной/произвольной точности, которые вы, вероятно, найдете полезными. Если скорость не нужна, у меня создается впечатление, что Python и Lisp используют по умолчанию бонусы.
Ну, я думаю, что лучший способ сделать такой арифметический расчет - использовать строки. Дайте ввод в качестве аргументов командной строки, а затем обработайте всю логику с помощью строковых функций, таких как atoi()
и itoa()
! Но, эй, это можно сделать для умножения и разделения? Я думаю, что таким образом strlen
введенных строк не имеет значения для программирования для компилятора до тех пор, пока логика не станет нормально.