Visualizzazione dei risultati da 1 a 6 su 6

Discussione: Factorize

  1. #1

    Factorize

    codice:
    import java.util.Arrays;
    
    
    public class Utils {
        
        public static boolean isPrime(long n){
            if(n==1) return false;
            int[] array = new int[0];
            for(int i=1; i<=n; i++){
                if( n% i == 0){
                    array = Arrays.copyOf(array, array.length+1);
                    array[array.length-1] = i;
                }
            }return (array[0] == 1 && array[1] == n);
        }
        
        public static String factorize(long d){
            long[] array = new long[0];
            long[] arrayNoRepeat = new long[0];
            long valore = d;
            String s ="";
        while(true){
            if(valore == 1) break;
            int i=2;
            while(i<=valore){
                if( valore % i ==0 && isPrime(i)){
                    array = Arrays.copyOf(array, array.length+1);
                    array[array.length-1] = i;
                    valore = valore/i;
                    break;
                }
                i++;
            }
        } for(int j=0; j<array.length; j++){
            
            if (Arrays.binarySearch(arrayNoRepeat, array[j])<0){
            arrayNoRepeat = Arrays.copyOf(arrayNoRepeat, arrayNoRepeat.length+1);
            arrayNoRepeat[arrayNoRepeat.length-1] = array[j];}
        }
    
        
        for(int x=0; x<arrayNoRepeat.length; x++){
            int counter = 0;
            for(int y=0; y<array.length; y++){
                if(arrayNoRepeat[x] == array[y]) counter++;
            }
            s+= counter > 1 ? arrayNoRepeat[x]+"("+counter+")" : " "+arrayNoRepeat[x]+" ";
        }
        return s;
        }
    
        public static void main(String[] args) {
            System.out.println(factorize(3000));
            System.out.println(factorize(10000000000001)); //<---------- ERRORE
        }
    }
    E' un pò farraginoso e sarebbe un metodo che fattorizza un numero di tipo long stampandone a video i fattori primi.
    Quando provo a fattorizzare 10000000000001 giustamente non entra nell'intervallo di rappresentazione degli int. Ho provato ad effettuare il casting di tutti gli array, ma il problema sono i cicli for. E' possibile iterare nel for su variabili long?
    « Una volta eliminato l'impossibile, ciò che resta, per quanto improbabile, deve essere la verità. (Sherlock Holmes) »

  2. #2
    Risolto basta inserire una L dopo la cifra :
    10000000000001L.
    Cosa cambia con la L finale?
    « Una volta eliminato l'impossibile, ciò che resta, per quanto improbabile, deve essere la verità. (Sherlock Holmes) »

  3. #3
    Di default tutti i numeri senza virgola espressi in "litteral" vengono considerati come int, la L alla fine dice al compilatore di considerarlo come long. Per quanto invece i numeri decimali essi sono sempre considerati double e per specificare che sono float si usa la lettera F

  4. #4
    Ti ringrazio. Esiste un metodo per dargli in pasto il numero senza la L finale?
    « Una volta eliminato l'impossibile, ciò che resta, per quanto improbabile, deve essere la verità. (Sherlock Holmes) »

  5. #5
    Utente di HTML.it
    Registrato dal
    Jul 2004
    Messaggi
    99
    o così o...

    codice:
    public class Utils {	private static Pattern longPattern = Pattern.compile("^[-+]?[0-9]+$");
    	private static Pattern doublePattern = Pattern.compile("^[-+]?[0-9]*\\.?[0-9]+([eE][-+]?[0-9]+)?$");
    	private static final String isNumRegex = "-?\\d+(\\.\\d+)?";
    	
        public static boolean isPrime(long n){
            if(n==1) return false;
            int[] array = new int[0];
            for(int i=1; i<=n; i++){
                if( n% i == 0){
                    array = Arrays.copyOf(array, array.length+1);
                    array[array.length-1] = i;
                }
            }return (array[0] == 1 && array[1] == n);
        }
        
        public static String factorize(long d){
            long[] array = new long[0];
            long[] arrayNoRepeat = new long[0];
            long valore = d;
            String s ="";
        while(true){
            if(valore == 1) break;
            int i=2;
            while(i<=valore){
                if( valore % i ==0 && isPrime(i)){
                    array = Arrays.copyOf(array, array.length+1);
                    array[array.length-1] = i;
                    valore = valore/i;
                    break;
                }
                i++;
            }
        } for(int j=0; j<array.length; j++){
            
            if (Arrays.binarySearch(arrayNoRepeat, array[j])<0){
            arrayNoRepeat = Arrays.copyOf(arrayNoRepeat, arrayNoRepeat.length+1);
            arrayNoRepeat[arrayNoRepeat.length-1] = array[j];}
        }
    
    
        
        for(int x=0; x<arrayNoRepeat.length; x++){
            int counter = 0;
            for(int y=0; y<array.length; y++){
                if(arrayNoRepeat[x] == array[y]) counter++;
            }
            s+= counter > 1 ? arrayNoRepeat[x]+"("+counter+")" : " "+arrayNoRepeat[x]+" ";
        }
        return s;
        }
        
        public static void checkNumber(String number){
        	
        	Pattern longPattern = Pattern.compile("^[-+]?[0-9]+$");
        	Pattern doublePattern = Pattern.compile("^[-+]?[0-9]*\\.?[0-9]+([eE][-+]?[0-9]+)?$");
     
        	if(!isNumeric(number)){
        		System.out.println("Attenzione numero inputato non valido (che cavolo scrivi!?)");
        	}
        	else if (longPattern.matcher(number).matches()) {
        		System.out.println(factorize(Long.parseLong(number)));
        	} else if (doublePattern.matcher(number).matches()) {
        		System.out.println("Attenzione il valore Double non è gestito!");
        	}  
        }
        public static boolean isNumeric(String str)
        { 
            return str.matches(isNumRegex);  
        }
    
    
        public static void main(String[] args) {
           checkNumber("3000") ;
            checkNumber("10000000000001") ; //<---------- ERRORE10000000000001L
        }
    }
    se mi chiedeste chi è per me un vero amico vi risponderei che è una persona che io considero alla pari di me.

  6. #6
    wow grande. Però così gli passi una stringa. Ma ti ringrazio ottima soluzione.
    « Una volta eliminato l'impossibile, ciò che resta, per quanto improbabile, deve essere la verità. (Sherlock Holmes) »

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.