2012-09-24 6 views
6

Por lo tanto, para mi asignación, tengo que escribir un programa que solicita al usuario una entrada de enteros y luego imprimir la factorización principal de ese número. Esto es lo que tengo:Java Muestra la factorización prima de un número

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

El problema que tengo ahora es que cada vez me encuentro con, como, el número 15453, consigo una lista de todos los factores de 1 a 100 y su exponente cuando solo quiero los factores primos, y estoy estancado en cuanto a cómo proceder.

+0

¿Se puede utilizar recursividad, funciones, clases de biblioteca? Solo necesito saber qué puedes usar aquí. – thatidiotguy

+3

Esa sentencia 'continue' no va a ejecutarse muy a menudo ... – Keppil

Respuesta

0

Estás cerca:

  1. La declaración System.out.println debe estar dentro de su bucle y sólo de visualización para count>0
  2. Retire la if(count == 0) { continue; }, es inútil ya que sólo se incrementa count
4

¡Ya casi está allí! Mueva el bloque if-continue fuera del ciclo for. De lo contrario, "continúa" el bucle más interno, en lugar del que pretendía.

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

Como alternativa, puede incluir la llamada System.out.println en if (count != 0), porque es la única instrucción que sigue a la continue:

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

Su programa de Ideone: link.

0

elimine la instrucción if (count == 0) {continue;} del ciclo while y póngala después, en el 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

¡No estoy seguro de por qué está imprimiendo la multiplicación dos veces! Aquí está el código limpio:

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

también puede obtener ayuda de la función a continuación.

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

Esta función devolverá el mayor factor primo del número proporcionado.

0

Por un lado, su continue está dentro del ciclo while, donde no tiene efecto alguno.La solución mínima sería

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

Pero usted tiene algunos otros problemas:

  • El código no está adecuadamente "factorizado" (irónicamente, "factorizado" en este contexto significa que no está dividido en
  • funciones
  • Los nombres de las variables no están bien elegidos
  • se utiliza un Goto (continue en este caso) cuando un if sería suficiente

mejor código sería

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

} 

consola:

8462696833 x 71

10086647 x 839

6857 x 1471

factor primo más grande: 6857

+0

explique en detalle –

Cuestiones relacionadas