Я пытаюсь поместить большое число в переменную 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





Вы можете указать целочисленный литерал, используя суффикс 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-файл или сценарий, и вперед.
Project Euler # 3 ... это сложная проблема ... У меня была такая же проблема. Я также посмотрел на BigInt lib, но заметил, что они неправильно реализуют постфиксные операторы ... поэтому я решил, что в их коде будут другие проблемы.