Обработка больших чисел в C++?

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

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

Какие-нибудь другие хорошие методы?

Я попытался немного уточнить. Не стесняйтесь поправлять меня, если я неправильно истолковал

Mark Biek 23.09.2008 00:36

Спасибо, сэр. спасибо за библиотеку .. но я хотел бы знать, есть ли какой-нибудь другой способ сделать это ?. я имею в виду без использования специальных stl для этого .. я использовал связанный список !!

kasperasky 23.09.2008 08:00
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
21
2
58 820
9

Ответы 9

предполагая, что вы говорите о вводе чисел, двойная точность даст вам 1,7976931348623157 x 10 ^ 308

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

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

Похоже, вы ищете способ ввести числа с произвольной точностью. вот две библиотеки, которые вы можете использовать: GMP и MAPM

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

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

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

Это правильно для Лисо. Если я занимаюсь громкими вещами, я использую Lisp. :)

Paul Nathan 30.10.2008 19:10

@Paul Nathan> Это верно для Лизо. Вы имеете в виду Лисп? или Liso - это какая-то библиотека, о которой я не знаю?

chollida 02.12.2009 23:20

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

#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 введенных строк не имеет значения для программирования компилятора, пока логика не будет в порядке.

Это не лучшее решение. Получение ввода из аргументов командной строки делает вашу программу бесполезной, если вы не делаете своего рода калькулятор командной строки. Кроме того, использование функций ato* предполагает, что вы уже знаете желаемый тип данных И что они будут в стандартном диапазоне точности, поэтому нет смысла тратить время на преобразование в них, а не в формат больших чисел, когда вы хотите просто нужно снова проанализировать эти числа, если вы даже правильно их прочитали. itoa также не входит в стандартную библиотеку C++.

GraphicsMuncher 10.12.2012 12:58

Посмотрите Пример использования больших целых чисел в C++. 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);

Другие вопросы по теме