Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1
    Utente di HTML.it
    Registrato dal
    Oct 2011
    Messaggi
    347

    Tipo di dato da utilizzare in una classe fattoriale

    come da titolo vorrei sapere che tipo di dato posso utilizzare, dal momento che l'int è un po stretto, per poter calcolare il fattoriale di numeri grandi: ad esempio 30 o 40 perchè a 40 anche il long restituisce valori sfalsati, mentre se uso il double poi mi ritorna un valore in virgola, che anche se esatto non mi piace XD
    come faccio?

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

    Re: Tipo di dato da utilizzare in una classe fattoriale

    Originariamente inviato da John360
    come da titolo vorrei sapere che tipo di dato posso utilizzare, dal momento che l'int è un po stretto, per poter calcolare il fattoriale di numeri grandi: ad esempio 30 o 40 perchè a 40 anche il long restituisce valori sfalsati, mentre se uso il double poi mi ritorna un valore in virgola, che anche se esatto non mi piace XD
    come faccio?
    Il int (32 bit) ti è già stato detto che arriva a max 2147483647. Il long (64 bit) a max 9223372036854775807.
    I valori "primitivi" interi di Java sono questi e appunto sono limitati per i fattoriali che vuoi calcolare tu.

    Ti serve la classe java.math.BigInteger. Non ha un limite preimpostato, nel senso che è una classe per gestire interi a precisione "arbitraria". Potresti gestire numeri di 1000 bit, 5000 bit, ecc...
    Chiaramente questo ha comunque un costo sia dal punto di vista della occupazione di memoria, sia per il tempo computazionale.

    Un oggetto BigInteger è "immutabile" (come java.lang.Integer e gli altri wrapper). Le operazioni non le fai con gli operatori classici + - * / ma con dei metodi che invochi sul BigInteger.

    Es.:
    codice:
    BigInteger biA = BigInteger.valueOf(10000);
    BigInteger biB = BigInteger.valueOf(3);
    
    BigInteger biRis = biA.multiply(biB);
    
    System.out.println(biRis);   // stampa 30000
    Vedi documentazione javadoc, che dovresti sempre tenere a portata di ... mouse.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  3. #3
    Utente di HTML.it
    Registrato dal
    Oct 2011
    Messaggi
    347
    e come faccio a cambiare i dati della classe? cioè come fa ad andare avanti il for del fattoriale se modificola variabile "i" in biginteger? dato che hai detto che è immutabile...
    codice:
    import java.math.*;
    import java.util.*;
    public class Fattoriale{
    	public static void main(String args[]){
    		Scanner read = new Scanner(System.in);
    		long n = -1;
    		System.out.println("__CALCOLO DEL FATTORIALE__");
    		do{
    			System.out.println("Inserire un numero intero positivo:");
    			boolean m = read.hasNextInt();
    			if(m == true)
    				n = read.nextInt();
    			else
    				read.next();
    		}
    		while(n < 0);
    		long fattoriale=1;
    		for(long i=n; i >= 1; i--){
    			fattoriale = i * fattoriale;
    		}
    		System.out.println(n+"!=" + fattoriale);
    	}
    }

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254
    Originariamente inviato da John360
    e come faccio a cambiare i dati della classe? cioè come fa ad andare avanti il for del fattoriale se modificola variabile "i" in biginteger? dato che hai detto che è immutabile...
    Per gli oggetti davvero "immutabili" (es. String, Integer, BigInteger) gli eventuali metodi che operano modifiche (se/quali dipende da cosa offre la classe, ovviamente) restituiscono un nuovo oggetto con il risultato senza toccare lo stato dell'oggetto su cui sono invocati.

    BigInteger biRis = biA.multiply(biB);

    lo stato di biA e biB non viene alterato. Viene creato e restituito un nuovo oggetto BigInteger.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  5. #5
    Utente di HTML.it
    Registrato dal
    Oct 2011
    Messaggi
    347
    e nel mio caso come faccio a iterare i?

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254
    Originariamente inviato da John360
    e nel mio caso come faccio a iterare i?
    Es. per incrementare:
    bi = bi.add(BigInteger.ONE);

    BigInteger.ONE è una costante già definita.

    E anzi no ... il problema non è la 'i' ma il parziale del fattoriale!!
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  7. #7
    Utente di HTML.it
    Registrato dal
    Oct 2011
    Messaggi
    347
    E quindi?

  8. #8
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254
    Originariamente inviato da John360
    E quindi?
    Non è in effetti la 'i' che deve essere (per forza) BigInteger. Questa conta 1 2 3 .... anche 100000 (esagerazione!). Basta un int.

    BigInteger deve essere il parziale del fattoriale (perché il valore si ingrandisce enormemente).

    codice:
    		long fattoriale=1;
    		for(long i=n; i >= 1; i--){
    			fattoriale = i * fattoriale;
    		}
    fattoriale fallo diventare BigInteger e inizializzalo a 1.
    La 'i' può anche essere int ma long va pure bene. Il fattoriale BigInteger devi moltiplicarlo per la 'i'. Ora: non c'è un multiply() che riceve un long ma solo uno che riceve un BigInteger. Quindi ad ogni ciclo crei "al volo" un BigInteger con il valore di 'i'.

    Le informazioni le hai già avute tutte nei miei precedenti messaggi. Vedi anche documentazione di BigInteger che è chiara e (credo) intuitiva.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  9. #9
    Utente di HTML.it
    Registrato dal
    Oct 2011
    Messaggi
    347
    Ok appena posso provo a farlo e vedo se ho capito! Nel caso posto il codice!

  10. #10
    Utente di HTML.it
    Registrato dal
    Oct 2011
    Messaggi
    347
    eccolo:
    codice:
    import java.math.*;
    import java.util.*;
    public class Fattoriale{
    	public static void main(String args[]){
    		Scanner read = new Scanner(System.in);
    		long n = -1;
    		System.out.println("__CALCOLO DEL FATTORIALE__");
    		do{
    			System.out.println("Inserire un numero intero positivo:");
    			boolean m = read.hasNextInt();
    			if(m == true)
    				n = read.nextInt();
    			else
    				read.next();
    		}
    		while(n < 0);
    		BigInteger bifatt = BigInteger.valueOf(1);
    		for(long i=n; i >= 1; i--){
    			BigInteger bii = BigInteger.valueOf(i);
    			bifatt = bifatt.multiply(bii);
    		}
    		System.out.println(n+"!=" + bifatt);
    	}
    }
    solo che non capisco una cosa... nel for viene modificato più volte la variabile del fattoriale... mentre tu prima mi hai detto che i bigI sono immutabili, in che senso sono immutabili?

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 © 2024 vBulletin Solutions, Inc. All rights reserved.