Question

J'essaie de placer un grand nombre dans une variable C ++. Le numéro est 600851475143

J'ai essayé unsigned long long int mais j'ai eu une erreur en disant que la constante était trop grosse. J'ai ensuite essayé une bibliothèque bigInt appelée BigInt - & Gt; http://mattmccutchen.net/bigint/

Le problème est que je ne peux pas compiler le code car de nombreuses erreurs concernant la lib.

référence non définie à `BigInteger :: BigInteger (int) '< - beaucoup d’entre elles.

Voici mon code jusqu'à présent:

#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;
    }
}

Si je mets un nombre plus petit et n'utilise pas la lib BigInt, ce programme fonctionne correctement. Toute aide sera appréciée: D

Était-ce utile?

La solution

Vous pouvez spécifier un littéral entier aussi long que le suffixe L.

Vous pouvez spécifier un entier littéral long par le suffixe LL.

#include <iostream>

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

    std::cout << num;
}

Autres conseils

Le nombre 600851475143 n'est pas trop long pour un long long int mais vous devez utiliser le suffixe LL lorsque vous utilisez une longue longue constante (ULL pour un long long long sans signe):

unsigned long long int num = 600851475143ULL;

Raison d'être d'une grande bibliothèque d'entiers consiste à représenter des entiers que votre langue ne peut pas gérer de manière native. Cela signifie que vous ne pouvez même pas l'écrire comme un littéral. Cette bibliothèque a probablement le moyen d’analyser une chaîne comme un grand nombre.

Dans un cas plus général, vous ne pouvez pas adapter votre numéro longtemps, et pouvez vivre avec la licence GNU LGPL ( http://www.gnu.org/copyleft/lesser.html ), je suggérerais d'essayer la bibliothèque multiprécision GNU ( http://gmplib.org/ ).

Il est extrêmement rapide, écrit en C et livré avec une très jolie bibliothèque wrapper C ++.

Existe-t-il une bibliothèque bigint à relier ou un bigint.cpp à compiler?

Si vous obtenez des erreurs de référence non définies pour la bibliothèque bignum, vous ne l’avez probablement pas liée. Sous Unix, vous devrez passer une option comme -lbigint. Si vous utilisez un IDE, vous devrez trouver les paramètres de l’éditeur de liens et ajouter la bibliothèque.

Comme pour les nombres, comme on l’a déjà dit, une constante naturelle est définie par défaut sur le type int. Vous devez utiliser LL / ll pour obtenir un long long.

Dans ce cas, la première chose à faire est de déterminer quel est le plus grand nombre que vous pouvez insérer dans un nombre long non signé. Comme il s'agit de 64 bits, le plus grand nombre serait 2 ^ 64-1 = 18446744073709551615, ce qui est supérieur à votre nombre. Ensuite, vous savez que vous faites quelque chose de mal et vous regardez la réponse de Martin York pour voir comment résoudre ce problème.

Essayez celui-ci. Fondamentalement, vous pouvez avoir votre propre classe personnalisée qui utilise une liste chaînée pour stocker le nombre de tailles infinies. (RAM est la restriction) Essaye celui-là https://mattmccutchen.net/bigint/

Si vous avez des problèmes avec cette bibliothèque cinq ans après avoir posé cette question, voici la solution. Vous ne pouvez pas simplement compiler votre programme, il échouera à se lier avec une erreur laide et impénétrable! Cette bibliothèque est une collection de fichiers c ++ que vous êtes censé compiler en fichiers .o et créer des liens. Si vous regardez la sortie du fichier make fourni avec l'exemple de programme, vous verrez ceci:

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

Remplacez sample par le nom de votre programme, collez ces lignes dans un fichier makefile ou un script, et c'est parti.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top