Большое число в C++

Я пытаюсь поместить большое число в переменную C++. Номер 600851475143

Я попробовал unsigned long long int, но получил ошибку, говоря, что константа слишком велика. Затем я попробовал библиотеку bigInt под названием BigInt -> http://mattmccutchen.net/bigint/

Проблема в том, что я не могу скомпилировать код, так как получаю много ошибок, касающихся библиотеки.

undefined ссылка на `BigInteger :: BigInteger (int) '<- много из них.

Вот мой код:

#include "string"
#include "iostream"       
#include "bigint/NumberlikeArray.hh"
#include "bigint/BigUnsigned.hh"
#include "bigint/BigInteger.hh"
#include "bigint/BigIntegerAlgorithms.hh"
#include "bigint/BigUnsignedInABase.hh"
#include "bigint/BigIntegerUtils.hh"
using namespace std;

int main() {

    //unsigned long int num = 13195;
    //unsigned long long int num = 600851475143;
    BigInteger num = 13195;
    int divider = 2;

    //num = 600851475143;

    while (1) {
        if ((num % divider) == 0) {
            cout << divider << '\n';
            num /= divider;
        }
        else
            divider++;

        if (num == 1)
            break;
    }
}

Если я поставлю меньшее число и не буду использовать библиотеку BigInt, эта программа будет работать нормально. Любая помощь будет оценена по достоинству: D

Project Euler # 3 ... это сложная проблема ... У меня была такая же проблема. Я также посмотрел на BigInt lib, но заметил, что они неправильно реализуют постфиксные операторы ... поэтому я решил, что в их коде будут другие проблемы.

paxos1977 27.10.2008 19:27
Стоит ли изучать 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 называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
10
1
24 081
9
Перейти к ответу Данный вопрос помечен как решенный

Ответы 9

Ответ принят как подходящий

Вы можете указать целочисленный литерал, используя суффикс L.
. Вы можете указать целочисленный литерал до длины с помощью суффикса LL.

#include <iostream>

int main()
{
    long long num = 600851475143LL;

    std::cout << num;
}

Число 600851475143 не слишком велико для long long int, но вам нужно использовать суффикс LL при использовании длинных длинных констант (ULL для unsigned long long int):

unsigned long long int num = 600851475143ULL;

Есть ли библиотека bigint для связывания или bigint.cpp для компиляции?

Суть большой целочисленной библиотеки состоит в том, чтобы представлять целые числа, которые ваш язык не может обрабатывать изначально. Это означает, что вы не можете даже записать это буквально. Возможно, в этой библиотеке есть способ разбирать строку как большое число.

Если вы получаете неопределенные справочные ошибки для библиотеки bignum, вероятно, вы не связали ее. В Unix вам нужно будет передать такую ​​опцию, как -lbigint. Если вы используете IDE, вам нужно будет найти настройки компоновщика и добавить библиотеку.

Что касается чисел, как уже было сказано, естественная константа по умолчанию имеет тип int. Вы должны использовать LL / ll, чтобы получить длинную длинную позицию.

Первое, что нужно сделать в этом случае, - это выяснить, какое наибольшее число может поместиться в беззнаковое длинное число. Поскольку он 64-битный, наибольшее число будет 2 ^ 64-1 = 18446744073709551615, что больше вашего числа. Тогда вы знаете, что делаете что-то не так, и смотрите на ответ Мартина Йорка, чтобы увидеть, как это исправить.

В более общем случае, когда вы не можете вместить свой номер в длинный длинный отрезок и можете жить с лицензией GNU LGPL (http://www.gnu.org/copyleft/lesser.html), я бы предложил попробовать библиотеку GNU Multiprecision (http://gmplib.org/).

Он очень быстрый, написан на C и поставляется с очень крутой C++ - библиотекой-оболочкой.

Попробуй это. По сути, у вас может быть свой собственный класс, который использует связанный список для хранения числа бесконечного размера. (RAM это ограничение) Попробуй это https://mattmccutchen.net/bigint/

Для всех, у кого есть проблемы с этой библиотекой через пять лет после того, как этот вопрос был задан, это ответ для вас. Вы не можете просто скомпилировать свою программу, она не сможет связать с уродливой непонятной ошибкой! Эта библиотека представляет собой набор файлов C++, которые вы должны скомпилировать в файлы .o и связать с ними. Если вы посмотрите на вывод make-файла, предоставленного с образцом программы, вы увидите следующее:

g++ -c -O2 -Wall -Wextra -pedantic BigUnsigned.cc
g++ -c -O2 -Wall -Wextra -pedantic BigInteger.cc
g++ -c -O2 -Wall -Wextra -pedantic BigIntegerAlgorithms.cc
g++ -c -O2 -Wall -Wextra -pedantic BigUnsignedInABase.cc
g++ -c -O2 -Wall -Wextra -pedantic BigIntegerUtils.cc
g++ -c -O2 -Wall -Wextra -pedantic sample.cc
g++ sample.o BigUnsigned.o BigInteger.o BigIntegerAlgorithms.o BigUnsignedInABase.o BigIntegerUtils.o -o sample

Замените sample именем своей программы, вставьте эти строки в make-файл или сценарий, и вперед.

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