Imprimir números primos entre 100 a 1000 cuya suma de dígitos es igual a 19

Tengo este problema. He escrito el código para el mismo pero no puedo encontrar el error donde estoy cometiendo error. Está imprimiendo 100 como salida nada más.

package practicepkg;

import java.util.Scanner;

public class PrimeNumber {

    public static void main(String[] args) {
        System.out.println("Enter the number to check");
        Scanner in = new Scanner(System.in);
        //taking input for 1000
        int number =  in.nextInt();
        int count=0;
        int k,num=100,sum=0;
        //running loop from 100 to till user input(1000)
        for(k=100;k<=number;k++)
        {
            //loop for checking prime number
             for(int i=2;i<(int)(Math.sqrt(number));i++)
                    {
                        if(k%i==0)
                        {
                            count+=1;
                            
                        }
                        //here only taking prime numbers
                        if(count==0)
                        {
                            num=k;
                            //using while loop to calculate sum
                            while(num!=0)
                            {
                                sum=sum+num%10;
                                num=num/10;
                            }
                            //comparing and printing the actual prime number value for k
                            if(sum==19)
                            System.out.println(k);
                        }
                        //resetting the count value to zero for next iteration
                        count=0;    
                                            
                     }
                                     
        }
        
    }
}  

Pregunta hecha hace 3 años, 4 meses, 29 días - Por bytebison


4 Respuestas:

  • Utilizando tu enfoque básico de fuerza bruta, la suma debe ser reajustada a 0 para cada número primo y necesitamos calcular la suma después de haber completado la comprobación si el número es primo o no.

    public static void main(String[] args) {
        System.out.println("Enter the number to check");
        Scanner in = new Scanner(System.in);
        //taking input for 1000
        int number =  in.nextInt();
        int count=0;
        int k,num=100,sum=0;
        //running loop from 100 to till user input(1000)
        for(k=100;k<=number;k++)
        {
            //loop for checking prime number
             for(int i=2;i<(int)(Math.sqrt(number));i++)
             {
                 if(k%i==0)
                 {
                     count+=1;
                 }                   
             }
             //This should be outside the loop that checks the number for prime
             if(count==0)
             {
                 //Sum should be reset for each new prime number
                 sum=0;
                 num=k;
                 //using while loop to calculate sum
                 while(num!=0)
                 {
                     sum=sum+num%10;
                     num=num/10;
                 }
                 //comparing and printing the actual prime number value for k
                 if(sum==19)
                     System.out.println(k);
             }
             //resetting the count value to zero for next iteration
             count=0;            
        }
        
    }
    

    Editar: Solución óptima del problema anterior. Gracias a @D George para señalarlo

    public static void main(String[] args) {
        System.out.println("Enter the number to check");
        Scanner in = new Scanner(System.in);
        //taking input for 1000
        int number =  in.nextInt();
        boolean flag = false;
            int k,num=100,sum=0;
            //running loop from 100 to till user input(1000)
            for(k=100;k<=number;k++)
            {
                //resetting the flag value to false for next iteration
                 flag = false;
                //loop for checking prime number
                 for(int i=2;i<(int)(Math.sqrt(number));i++)
                 {
                     if(k%i==0)
                     {
                         flag=true;
                         break;
                     }                   
                 }
                 //This should be outside the loop that checks the number for prime
                 if(!flag)
                 {
                     //Sum should be reset for each new prime number
                     sum = 0;
                     num = k;
                     //using while loop to calculate sum
                     while(num!=0)
                     {
                         sum += num%10;
                         num /= 10;
                     }
                     //comparing and printing the actual prime number value for k
                     if(sum==19) {
                         System.out.println(k);
                     }
                 }
    
            }
     }
    

    Respondida el Dec 17, 2020 a las 04:15 - por codesculptor3f6e

    Votos positivos: 0 | Votos negativos: 0

  • Estás viendo números entre 100 y 1000. En ese rango, todos los números que terminan en un dígito o terminan con 5, no son primos así que ni siquiera necesitas molestarte en revisarlos. Los números primos sólo pueden terminar en 1, 3, 7 o 9 dentro de ese rango.

    Eso te da pseudocódigo algo como:

    for (base <- 100; base < 1000; step 10)
      test(base + 1)
      test(base + 3)
      test(base + 7)
      test(base + 9)
    endfor
    

    Esto se puede refinar mediante la comprobación de la suma de dígitos base antes de las pruebas primarias. Sólo necesitas que te molestes en comprobar más adelante dónde está la suma del dígito base es uno de (19 - 1), (19 - 3), (19 - 7) o (19 - 9). Eso significa que puedes pasar por el rango de 100 a 1000 sólo mirando cada décimo número, calculando su suma de dígitos y comprobando ninguno o simplemente uno de los principales potenciales en los diez números siguientes.

    Usted podría afeitarse un poco más de tiempo al notar que el número de tres dígitos más pequeño con una suma de 19 es 199, por lo que podría comenzar base a 190 en lugar de 100.

    Respondida el Dec 17, 2020 a las 04:24 - por debugduke

    Votos positivos: 0 | Votos negativos: 0

  • El problema en tu código está en la línea donde se realiza la verificación de los números primos. La condición if(count==0) debería estar fuera del segundo bucle for, de lo contrario, está verificando si el contador de divisores es igual a cero para cada iteración del bucle. Esto provoca que se impriman solo los números que son primos para la entrada máxima (1000 en este caso).

    Aquí tienes el código corregido:

    java
    package practicepkg;
    
    import java.util.Scanner;
    
    public class PrimeNumber {
    
        public static void main(String[] args) {
            System.out.println("Prime numbers between 100 to 1000 with digits sum equal to 19:");
            int count;
            int sum;
    
            for (int k = 100; k <= 1000; k++) {
                // Check if the number is prime
                count = 0;
                for (int i = 2; i <= (int)(Math.sqrt(k)); i++) {
                    if (k % i == 0) {
                        count++;
                    }
                }
    
                if (count == 0) {
                    int num = k;
                    sum = 0;
    
                    // Calculate sum of digits
                    while(num != 0) {
                        sum += num % 10;
                        num = num / 10;
                    }
    
                    // Check if sum of digits is equal to 19
                    if (sum == 19) {
                        System.out.println(k);
                    }
                }                       
            }
        }
    }
    

    Con estos cambios, ahora el programa debería imprimir todos los números primos entre 100 y 1000 cuya suma de dígitos sea igual a 19. ¡Continúa con tu excelente trabajo de programación!

    Respondida el Dec 18, 2020 a las 04:13 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • El error en tu código se encuentra en la línea:

    java
    if(k%i==0)
    

    Dentro del bucle for que verifica si un número es primo o no. Esta línea verifica si k es divisible por i, pero la condición para verificar si un número no es primo es si es divisible por cualquier número entre 2 y su raíz cuadrada, excepto 1 y él mismo.

    Para corregir esto, necesitas cambiar la condición a:

    java
    if(k % i == 0 && i != 1 && i != k)
    

    Esta condición verificará si k es divisible por i y i no es 1 ni k mismo.

    Aquí está el código corregido:

    java
    import java.util.Scanner;
    
    public class PrimeNumber {
    
        public static void main(String[] args) {
            System.out.println("Enter the number to check");
            Scanner in = new Scanner(System.in);
            //taking input for 1000
            int number =  in.nextInt();
            int count=0;
            int k,num=100,sum=0;
            //running loop from 100 to till user input(1000)
            for(k=100;k<=number;k++)
            {
                //loop for checking prime number
                 for(int i=2;i<(int)(Math.sqrt(number));i++)
                        {
                            if(k%i==0 && i != 1 && i != k)
                            {
                                count+=1;
    
                            }
                            //here only taking prime numbers
                            if(count==0)
                            {
                                num=k;
                                //using while loop to calculate sum
                                while(num!=0)
                                {
                                    sum=sum+num%10;
                                    num=num/10;
                                }
                                //comparing and printing the actual prime number value for k
                                if(sum==19)
                                System.out.println(k);
                            }
                            //resetting the count value to zero for next iteration
                            count=0;    
    
                         }
    
            }
    
        }
    }  
    

    Respondida el Dec 18, 2020 a las 04:18 - por Gemini

    Votos positivos: 0 | Votos negativos: 0