Domanda

Sto cercando di inserire un numero elevato in una variabile C ++. Il numero è 600851475143

Ho provato int a lungo insegnato ma ho ricevuto un errore dicendo che la costante era troppo grande. Ho quindi provato una libreria bigInt chiamata BigInt - & Gt; http://mattmccutchen.net/bigint/

Il problema è che non riesco a compilare il codice poiché visualizzo molti errori relativi alla lib.

riferimento indefinito a `BigInteger :: BigInteger (int) '< - molti di questi.

Ecco il mio codice finora:

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

Se inserisco un numero più piccolo e non uso la libreria BigInt, questo programma funziona bene. Qualsiasi aiuto sarà apprezzato: D

È stato utile?

Soluzione

È possibile specificare un valore intero letterale lungo dal suffisso L.
È possibile specificare un valore intero letterale lungo per il suffisso LL.

#include <iostream>

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

    std::cout << num;
}

Altri suggerimenti

Il numero è 600851475143 non è troppo grande per un int long long ma è necessario utilizzare il suffisso LL quando si usano costanti long long (ULL per int long long unsigned):

unsigned long long int num = 600851475143ULL;

La ragion d'essere di una grande libreria di numeri interi è di rappresentare numeri interi che la tua lingua non può gestire in modo nativo. Ciò significa che non puoi nemmeno scriverlo come letterale. Probabilmente, quella libreria ha un modo per analizzare una stringa come un grande numero.

In un caso più generale in cui non è possibile adattare il proprio numero a lungo e si può vivere con la licenza GNU LGPL ( http://www.gnu.org/copyleft/lesser.html ), suggerirei di provare la GNU Multiprecision Library ( http://gmplib.org/ ).

È estremamente veloce, scritto in C e viene fornito con una libreria C ++ - wrapper molto interessante.

Esiste una libreria bigint da collegare o una bigint.cpp da compilare?

Se ricevi errori di riferimento indefiniti per la libreria bignum, probabilmente non l'hai collegato. Su Unix, dovrai passare un'opzione come -lbigint. Se stai utilizzando un IDE, dovrai trovare le impostazioni del linker e aggiungere la libreria.

Per quanto riguarda i numeri, come è già stato detto, una costante naturale passa automaticamente al tipo int. È necessario utilizzare LL / ll per ottenere molto tempo.

La prima cosa da fare in questo caso è capire qual è il numero più grande che puoi inserire in un lungo senza segno. Poiché è 64 bit, il numero più grande sarebbe 2 ^ 64-1 = 18446744073709551615, che è più grande del tuo numero. Allora sai che stai facendo qualcosa di sbagliato e guardi la risposta di Martin York per vedere come risolverlo.

Prova questo. Fondamentalmente puoi avere la tua classe personalizzata che utilizza un elenco collegato per memorizzare il numero di dimensioni infinite. (RAM è la restrizione) Prova questo https://mattmccutchen.net/bigint/

Per chiunque abbia problemi con questa libreria cinque anni dopo che questa domanda è stata posta, questa è la risposta per te. Non puoi semplicemente compilare il tuo programma, non riuscirà a collegarsi con un brutto errore impenetrabile! Questa libreria è una raccolta di file c ++ che dovresti compilare in file .o e link verso. Se guardi l'output del file make fornito con il programma di esempio vedrai questo:

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

Sostituisci sample con il nome del tuo programma, incolla queste righe in un makefile o in uno script e via.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top