2012-09-24 10 views
6

Quindi per il mio compito, devo scrivere un programma che chiede all'utente un input intero e quindi stampare la fattorizzazione principale di quel numero. Questo è quello che ho:Java Visualizza la fattorizzazione primaria di un numero

import java.util.Scanner; 

public class PrimeFactor { 
    public static void main(String[] args) { 
     System.out.print("Enter a positive number: "); 
     Scanner scanner = new Scanner (System.in); 
     int number = scanner.nextInt(); 
     int count; 
     for (int i = 2; i<=(number); i++) { 
      count = 0; 
      while (number % i == 0) { 
       number /= i; 
       count++; 
       if (count == 0) { 
        continue; 
       } 
      } 
      System.out.println(i+ "**" + count); 
     } 
    } 
} 

Il problema che ho in questo momento è che ogni volta che eseguo con, come, il numero 15453, ho un elenco di tutti i fattori da 1 a 100 e il suo esponente quando ho voglio solo i fattori primi, e sono bloccato su come procedere.

+0

È possibile utilizzare la ricorsione, le funzioni, le classi di libreria? Ho solo bisogno di capire cosa puoi usare qui. – thatidiotguy

+3

L'istruzione 'continue' non verrà eseguita molto spesso ... – Keppil

risposta

0

Sei vicino:

  1. La dichiarazione System.out.println deve essere all'interno del vostro ciclo for e solo visualizzazione per count>0
  2. Rimuovere la if(count == 0) { continue; }, è inutile dal momento che solo incrementato count
4

Sei quasi arrivato! Spostare il blocco if-continue al di fuori del ciclo for. Altrimenti, "continua" il ciclo più interno, piuttosto che quello desiderato.

while (number % i == 0) { 
    number /= i; 
    count++; 
} 
if (count == 0) { 
    continue; 
} 
System.out.println(i+ "**" + count); 

In alternativa, si potrebbe racchiudere la chiamata System.out.println in if (count != 0), perché è l'unica dichiarazione a seguito della continue:

while (number % i == 0) { 
    number /= i; 
    count++; 
} 
if (count != 0) { 
    System.out.println(i+ "**" + count); 
} 

il programma su Ideone: link.

0

rimuovere il comando if (count == 0) {continue;} dal ciclo while e inserirlo dopo, nel ciclo for. :)

for (int i = 2; i<=(number); i++) { 
     count = 0; 
     while (number % i == 0) { 
      number /= i; 
      count++; 
     } 
     if(count==0) continue; 
     System.out.println(i+ "**" + count); 
    } 
0

Non so perché si stampa la moltiplicazione due volte! Ecco il codice ripulito:

public static void printPrimeNumbers(int prime) { 

    int n; 

    for (int i = 2; i <= prime; i++) { 
     n = 0; 
     while (prime % i == 0) { 
      prime /= i; 
      n++; 

     } 

     if (n != 0) { 
      for (int j = n; j > 0; j--) { 
       System.out.print(i); 

       if (prime != 1) { 
        System.out.print("*"); 
       } 
      } 
     } 
    } 
} 
0

è anche possibile ottenere aiuto dalla funzione di seguito.

public int getPrimeNumber(double number) { 
    int j = 0; 
    while (number % 2 == 0) { 
     number = number/2; 
     j = 2; 
    } 

    for (int i = 3; i <= number; i = i + 2) { 
     while (number % i == 0) { 
      number = number/i; 
      j = i; 
     } 
    } 

    return j == 0 ? 1 : j; 
} 

Questa funzione restituirà il primo fattore maggiore del numero specificato.

0

Per prima cosa, il tuo continue si trova all'interno del ciclo while, dove non ha alcun effetto.La correzione minima sarebbe

public class PrimeFactor { 
    public static void main(String[] args) { 
     System.out.print("Enter a positive number: "); 
     Scanner scanner = new Scanner (System.in); 
     int number = scanner.nextInt(); 
     int count; 
     for (int i = 2; i<=(number); i++) { 
      count = 0; 
      while (number % i == 0) { 
       number /= i; 
       count++; 
      } 
      if (count == 0) { 
       continue; 
      } 
      System.out.println(i+ "**" + count); 
     } 
    } 
} 

Ma avete altri problemi:

  • Il codice non è propriamente "scomposto" (ironicamente, "presi" in questo contesto significa che è non è suddiviso in funzioni
  • I nomi delle variabili sono mal scelti
  • si utilizza un goto (continue in questo caso) quando un if sarebbe sufficiente

Meglio codice sarebbe

public class PrimeFactor { 
    public static void main(String[] args) { 
     System.out.print("Enter a positive number: "); 
     Scanner scanner = new Scanner (System.in); 
     printFactors(scanner.nextInt()); 
    } 
    public static void printFactors(int product) { 
     for (int factor = 2; factor <= product; factor++) { 
      int exponent = 0; 
      while (product % factor == 0) { 
       product /= factor; 
       exponent++; 
      } 
      if (exponent > 0) { 
       System.out.println(factor+ "**" + exponent); 
      } 
     } 
    } 
} 
1
public class _03_LargestPrimeFactor { 

public static void main(String[] args) { 

    long a = 600851475143L; 

    for(int i=2; i<(a/i); i++){       // no factors would exist beyond a/i for a particular i 

     while(a%i == 0){        // if i is a factor 
      a = a/i;         // divide a by i else we wont get a prime number 
      System.out.print(a + " x " + i + "\n"); 
     } 
    } 

    if(a > 1) 
    System.out.println("largest prime factor: " + a); 
} 

} 

console:

8462696833 x 71

10086647 x 839

6857 x 1471

più grande fattore primo: 6857

+0

spiegarlo in dettaglio –