Visualizzazione dei risultati da 1 a 5 su 5
  1. #1

    [Java] BigInteger subtract

    Ciao a tutti,
    devo realizzare un metodo che calcoli il fattoriale di un numero, utilizzando i BigInteger.
    Il problema mi si presenta col comando
    codice:
    	a.subtract(BigInteger.ONE);
    dove a è dichiarato come:
    codice:
    BigInteger a= new BigInteger("5");
    Nell'esempio che sto facendo ipotizzo che sia da calcolare il fattoriale di 5, quindi di volta in volta dovrei sottrarre 1 ad a.

    Ho notato che 5 è una stringa, mentre subtract() vuole un numero, ma non capisco se in questo caso va bene così..

    Ho un'altra domanda: Qualcuno mi saprebbe spiegare, anche in modo semplice, come i BigInteger memorizzano il numero? Cioé, come mai possono contenere numeri grandissimi?

    Ho letto nelle API ma non ho capito molto

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: [Java] BigInteger subtract

    Originariamente inviato da Lasentinella
    Ciao a tutti,
    devo realizzare un metodo che calcoli il fattoriale di un numero, utilizzando i BigInteger.
    Il problema mi si presenta col comando
    codice:
    	a.subtract(BigInteger.ONE);
    dove a è dichiarato come:
    codice:
    BigInteger a= new BigInteger("5");
    Nell'esempio che sto facendo ipotizzo che sia da calcolare il fattoriale di 5, quindi di volta in volta dovrei sottrarre 1 ad a.

    Ho notato che 5 è una stringa, mentre subtract() vuole un numero, ma non capisco se in questo caso va bene così..
    Se si ha in input un 'int', io il fattoriale lo farei così:

    codice:
    public static BigInteger factorial (int value)
    {
        if (value < 0)
            throw new IllegalArgumentException ("value cannot be negative");
    
        BigInteger f = BigInteger.ONE;
    
        while (value > 1)
            f = f.multiply (BigInteger.valueOf (value--));
    
        return f;
    }
    Originariamente inviato da Lasentinella
    Ho un'altra domanda: Qualcuno mi saprebbe spiegare, anche in modo semplice, come i BigInteger memorizzano il numero? Cioé, come mai possono contenere numeri grandissimi?

    Ho letto nelle API ma non ho capito molto
    Bisogna andare a vedere il sorgente. Comunque il concetto è molto semplice: tra i vari campi interni, BigDecimal ha un campo int[] mag;
    Il numero, qualunque sia la sua dimensione, è memorizzato in un normalissimo array di int.

    Si vuole avere un valore a 1024 bit? Allora BigInteger crea un array di 1024/32 = 32 int. La documentazione nel sorgente poi spiega che gli int sono memorizzati in formato "big-endian", ovvero mag[0] contiene l'int più significativo.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3

    Re: Re: [Java] BigInteger subtract

    Ti ringrazio molto per le spiegazioni!!!
    L'unico problema è il fatto che ho in input un BigInteger(scusa, mi ero dimenticato di specificarlo), e che quindi devo sottrarre 1 a quello..e non ci riesco

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: Re: Re: [Java] BigInteger subtract

    Originariamente inviato da Lasentinella
    L'unico problema è il fatto che ho in input un BigInteger(scusa, mi ero dimenticato di specificarlo), e che quindi devo sottrarre 1 a quello..e non ci riesco
    a = a.subtract(BigInteger.ONE);

    Ti mancava l'assegnazione. BigInteger è un oggetto immutabile, quindi fare a.subtract(BigInteger.ONE) non modifica lo stato dell'oggetto referenziato da 'a'.

    EDIT: per completezza, riporto quello che farei io per calcolare il fattoriale avendo in input un BigInteger:

    codice:
    public static BigInteger factorial (BigInteger value)
    {
        if (value.signum () < 0)
            throw new IllegalArgumentException ("value cannot be negative");
    
        BigInteger f = BigInteger.ONE;
        
        while (value.compareTo (BigInteger.ONE) > 0)
        {
            f = f.multiply (value);
            value = value.subtract (BigInteger.ONE);
        }
        
        return f;
    }
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Arghhhhhh non mi era proprio venuto in mente di provarci!
    Grazie infinite ancora, sia per quello che per l'algoritmo, sei stato molto gentile
    Ciao!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.