JAVA primos, pares e impares

Iniciado por iamedgarrios, 3 Agosto 2017, 01:35 AM

0 Miembros y 1 Visitante están viendo este tema.

iamedgarrios

Quiero un programa que muestre pida numeros al usuario hasta que ingrese un "0" o un número negativo, cuando esto ocurra, el programa debe mostrar:
1.-Cuántos numeros se ingresarón
2.Cuántos son primos
3.-Cuantos son pares
4.- Cuantos son impares.

He realizado el codigo para los casos 2,3, y 4. ¿Puedo unir el codigo que ya tengo de algúna manera?
Honestamente no tengo idea de que necesito o por donde proceder, pues es mi primer curso de Java.
¿Que deberia aprender para poder resolver esto?

Tengo condigo para los números primos :

package nprimo;
import java.util.Scanner;

public class Nprimo {

   public static void main(String[] args) {
       int temp;
       boolean isPrime=true;
       Scanner scan= new Scanner(System.in);
       System.out.println("Ingrese un numero");
       int num = scan.nextInt();
       for (int i=2;i<=num/2;i++)
       {
           temp=num%i;
           if (temp==0)
           {
               isPrime=false;
               break;
           }
       }
       if(isPrime)
           System.out.println(num +"Es un numero primo :) ");
       else
           System.out.println(num +"No es un número primo :( ");
   }
}


y el codigo para saber si el número es par o impar.

import java.util.Scanner;
public class Main {
public static void main(String[] args) {
int n;
String m="";
System.out.println("*Determinarn numero es par o impar*");
System.out.println("");
System.out.println("ingreseumero");
Scanner teclado=new Scanner(System.in);
n=teclado.nextInt();
if(n%2==0)
m="es par";
else
m="es impar";
System.out.println("elro "+n+" "+m);
}
}



Gracias.

Serapis

#1
Funcion TareasDeMates
    entero n, Cuenta, Pares, Impares, Primos

    Hacer
        n = PedirNumero
        Si (n>0) luego
            Cuenta +=1
            Si ((n and 1) = 0) luego
                Pares +=1
                Si (n == 2) luego   // Como par, sólo el número 2 se considera primo, pués no es divisible más que por sí mismo y la unidad, que es lo que define a un primo.
                    Primo +=1
                Fin si
            Si no
                Impares +=1
                Si EsPrimo(n) luego  //un primo solo puede ser impar... luego va solo aquí
                    Primos +=1
                Fin si
            Fin si
        Fin si         
    Repetir Mientras (n sea mayor que 0)
   
    Mostrar mensaje: Cuenta, Pares, Impares, Primos
Fin Funcion


Buleano = EsPrimo(Entero n)
    Entero Max

    Max = RaizCuadrada(n)  //eliminar decimales...
    Bucle para k desde 3 hasta Max en incrementos de 2
        Si ((n modulo k) = 0) luego  // es decir si tras la división el resto es 0
            Devolver FALSE // es divisible por otro valor que no es 1 y sí mismo.
        Fin si
    Fin Bucle
    Devolver TRUE
Fin Funcion


Para optimizarlo, es preferible al inicio crear una tabla de primos (se crea una sola vez). Luego la función EsPrimo se modifica, para mediante una búsqueda binaria (sobre la tabla de primos), se localiza si el número entrado existe en la tabla, si existe es primo, si no se encuentra no lo es.
Como eres nuevo, seguramente no seas capaz de hacer una búsqueda binaria, vale... entonces creas un bucle 'While' y lo recorres mientras el número en el bucle sea menor que el recibido, si se encontró devuelve TRUE, si se llega al límite del bucle, se devuelve FALSE.

El dilema con una tabla de primos, es cuánto de grande es el mayor primo que se va a buscar, por que si no está contenido en la tabla, sin duda devolverá false, cuando en realidad 'no lo sabemos', en ese caso, si finaliza el bucle se compara si el primo mayor en la tabla es menor que el número entrado y e ese caso devolver un valor INCIERTO (esto es un mensaje de advertencia: el valor recibido es mayor que el máximo primo guardado en la tabla...)

Pero una tabla, acelera mucho los cálculos...

biestable

Con respecto a tu pregunta entiendo que lo que te falta por hacer es el punto 1, el saber cuantos números ha ingresado el usuario. Es más fácil que lo que ya has hecho.
en pseudocódigo sería más o menos así:

int primos,pares,impares;
int contador=0
if( recibo un número menor o igual que cero){
     devuelve contador primos pares impares;
}else{
    contador++;
   // aqui va el resto del código para ver si es primo, par o impar
}

En cuanto a lo de los números primos, una tabla, conjunto o lista de primos (que puedes sacar de internet) no es mala idea, los problemas que tiene esta solución son los ya comentados por nebire.

por último, en el código que tienes para buscar los primos en la parte de:

for (int i=2;i<=num/2;i++)

el bucle se extiende más de lo necesario, quedaría un poco mejor así:

raiz=math.sqrt(num);
for (int i=2; i<=raiz ;i++)

Deteniendo el bucle cuando lleguemos a la raíz del numero introducido en vez de a la mitad.