Méthode des Nombres Premiers Java


La question est exactement la suivante:

Écrivez une méthode qui détermine si un nombre est premier. Ensuite, utilisez cette méthode pour écrire une application qui détermine et affiche tous les nombres premiers inférieurs à 10 000.

J'ai déjà écrit un programme qui trouve tous les nombres premiers jusqu'à 10 000, mais j'en ai trouvé un plus simple et plus efficace sur StackOverflow, et c'est ceci:

package prime;

import java.util.Scanner;

public class Prime 
{
    public static void main(String[] args) 
    {
        for(int i = 1; i <= 10000; i++)
        {
            int factors = 0;
            int j = 1;

            while(j <= i)
            {
                if(i % j == 0)
                {
                    factors++;
                }
                j++;
            }
            if (factors == 2)
            {
                System.out.println(i);
            }
        }
    }
}

Puisque je suis très nouveau en Java et que je ne suis surtout pas bon dans les méthodes, ce problème est particulièrement difficile pour moi. J'ai essayé de faire une méthode, mais rien n'est retourné, et quand j'essaie de retourner quelque chose, j'obtiens erreur après erreur après erreur.

L'aide dont j'ai besoin est principalement un pseudo-Code pour ce que je devrais faire pour résoudre ce problème; je ne vous demande pas la réponse, je demande juste un début.

Author: Fish Below the Ice, 2014-10-08

7 answers

package prime;

public class Prime 
{
    public static void main(String[] args) 
    {
       for(int i = 1; i <= 10000; i++)
       {
         if (isPrimeNumber(i))
         {
            System.out.println(i);
         }
       }
    }


    public static boolean isPrimeNumber(int i) {
        int factors = 0;
        int j = 1;

        while(j <= i)
        {
            if(i % j == 0)
            {
                factors++;
            }
            j++;
        }
        return (factors == 2);
  }
}
 3
Author: ssk, 2014-10-08 01:05:14

Écrire une méthode qui détermine si un nombre est premier. Ensuite, utilisez cette méthode pour écrire une application qui détermine et affiche tous les nombres premiers inférieurs à 10 000.

Il me semble que vous avez besoin d'une méthode qui renvoie true si le nombre que vous lui transmettez est premier et false sinon. Donc, tout ce que vous devez vraiment faire ici est de déplacer la partie du code qui traite de déterminer si un nombre est premier et, à l'intérieur de cette méthode, au lieu d'imprimer le nombre quand il est premier, retourner vrai sinon retourner faux. Ensuite, à l'intérieur de la méthode principale, imprimez le nombre si cette fonction indique que l'entier actuel est premier (en renvoyant true) ou ne faites rien autrement. C'est le mieux que je puisse faire pour expliquer la solution sans vous donner le code.

EDIT: Puisque vous avez demandé un pseudocode:

main() 
   for i in 1..10000 :
     if isPrime(i)
        print i


isPrime(i):
    factors = 0
    num = 1

    while num is less than or equal to i:
        if i mod nums is 0:
            increment factors
        increment nums
    return (factors == 2) 
 1
Author: dramzy, 2014-10-08 01:11:31

J'ai trouvé une autre solution en utilisant java streams:

import java.util.stream.LongStream;

public static boolean isPrime(long num) {
    return num > 1 && LongStream.rangeClosed(2, (long)Math.sqrt(num)).noneMatch(div-> num % div== 0);
}

Voici un cas de test pour prouver que cela fonctionne:

// First 168 primes, retrieved from https://en.wikipedia.org/wiki/Prime_number
private static final List<Integer> FIRST_168_PRIMES =
        Arrays.asList(2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199, 211, 223, 227, 229, 233, 239, 241, 251, 257, 263, 269, 271, 277, 281, 283, 293, 307, 311, 313, 317, 331, 337, 347, 349, 353, 359, 367, 373, 379, 383, 389, 397, 401, 409, 419, 421, 431, 433, 439, 443, 449, 457, 461, 463, 467, 479, 487, 491, 499, 503, 509, 521, 523, 541, 547, 557, 563, 569, 571, 577, 587, 593, 599, 601, 607, 613, 617, 619, 631, 641, 643, 647, 653, 659, 661, 673, 677, 683, 691, 701, 709, 719, 727, 733, 739, 743, 751, 757, 761, 769, 773, 787, 797, 809, 811, 821, 823, 827, 829, 839, 853, 857, 859, 863, 877, 881, 883, 887, 907, 911, 919, 929, 937, 941, 947, 953, 967, 971, 977, 983, 991, 997);

@Test
public void testNumberIsPrime() {
    FIRST_168_PRIMES.stream().forEach(integer -> assertTrue(isPrime(integer)));
}

@Test
public void testNumberIsNotPrime() {
    List<Integer> nonPrime = new ArrayList<>();
    for (int i = 2; i < 1000; i++) {
        if (!FIRST_168_PRIMES.contains(i)) {
            nonPrime.add(i);
        }
    }

    nonPrime.stream().forEach(integer -> assertFalse(isPrime(integer)));
}
 1
Author: oleg.cherednik, 2017-12-06 23:44:14
public boolean isPrime(long num)
{
   double limit = Math.sqrt(num);
   for (long i = 2; i < limit; i++)
       if(num%i == 0)
           return false;
   return true;
}
 1
Author: Brenann, 2017-12-07 02:21:10
/**
* List all prime numbers from 101 to 200
* for responding your question, I think it is a good view to have it done
* @ Joannama
*
*/

public class PrimeNum
{
    public static void main(String[] args)
    {
        for ( int i = 101; i <= 200 ; i += 2)
        {
            // get rid of even number from 101 to 200
            //because even number are never a prime number
            boolean f = true;

            //assume these numbers are prime numbers
            for ( int j = 2; j < i; j++)
            {
                if ( i % j == 0)
                {
                    f = false;
                    // if the reminder = 0,
                    //which means number is not a prime,
                    //therefore f = false and break it
                    break;
                }
            }
            if ( ! f)
            {
                continue;
            }
            System.out.print("\u0020" + i);
        }
    }
}
 0
Author: Miracle Ma, 2017-02-16 16:23:22

Comme le Brenann posté. La meilleure façon de calculer si c'est un premier, mais avec une seule correction à la limite. Vous devez y ajouter 1, sinon il détecte les faux positifs.

public boolean isPrime(long num){
   double limit = Math.sqrt(num) + 1;
   for (long i = 2; i < limit; i++)
       if(num%i == 0)
           return false;
   return true;
}
 0
Author: Dragoslav Petrovic, 2018-07-30 00:47:06
static int primeNumber(int n){
  int i = 1, factor = 0;
  while(i <= n){
  if(n % i == 0){
  factor++;
  }
  i++;
  }
  if (factor == 2){
  return 1;
  }
   return 0;
  }
 -3
Author: Friat, 2015-05-22 14:09:31