web-dev-qa-db-fra.com

Calcul et impression du nième nombre premier

J'essaie de calculer des nombres premiers, ce que j'ai déjà fait. Mais je veux calculer et imprimer SEULEMENT le nième nombre premier (entrée utilisateur), tout en calculant le reste (ils ne seront pas imprimés), seul le nième nombre premier sera imprimé.

Voici ce que j'ai écrit jusqu'à présent:

import Java.util.Scanner;
/**
 * Calculates the nth prime number
 * @author {Zyst}
 */
public class Prime {
    public static void main(String[] args) {

        Scanner input = new Scanner(System.in);
        int n, 
            i = 2, 
            x = 2;

        System.out.printf("This program calculates the nth Prime number\n");
        System.out.printf("Please enter the nth prime number you want to find: ");
        n = input.nextInt();

        for(i = 2, x = 2; i <= n; i++) {
            for(x = 2; x < i; x++) {
                if(i % x == 0) {
                    break;
                }
            }
            if(x == i) {
                System.out.printf("\n%d is prime", x);
            }
        }
    }
}

C'est le programme que j'ai écrit pour calculer les nombres premiers de 1 à n. Cependant, je veux qu’il n’imprime que le nième nombre premier,

Ce que j’ai pensé, c’est de créer une sorte de compte int et de le taper chaque fois qu’il trouve un nombre premier, et lorsque le compte == n, il affiche ce nombre, mais je ne vois pas trop atterrir.

30
Erick
int counter = 0;

for(int i = 1; ; i++) {
    if(isPrime(i)
        counter++;

    if(counter == userInput) {
        print(i);
        break;
    }
}

Edit: Votre fonction principale pourrait nécessiter un peu de travail. En voici un que j'ai écrit:

private static boolean isPrime(long n) {
    if(n < 2)
        return false;

    for (long i = 2; i * i <= n; i++) {
        if (n % i == 0)
            return false;
    }
    return true;
}

Remarque - vous devez uniquement aller jusqu'à sqrt (n) lorsque vous examinez des facteurs, d'où le i * i <= n

6
ggrigery

Java.math.BigInteger a une méthode nextProbablePrime (). Bien que je suppose que ceci est destiné à la cryptographie, vous pouvez l’utiliser pour votre travail.

BigInteger prime = BigInteger.valueOf(0);
for (int i = 0; i < n; i++) {
    prime = prime.nextProbablePrime();
}
System.out.println(prime.intValue());
5
Adam

Vous essayez de faire trop dans la méthode principale. Vous devez diviser cela en parties plus gérables. Ecrivez une méthode boolean isPrime(int n) qui renvoie true si un nombre est premier et false sinon. Puis modifiez la méthode principale pour qu'elle utilise isPrime.

5
kevin cline

Je viens d'ajouter les lignes manquantes dans votre propre processus de pensée. 

static int nthPrimeFinder (int n) {

    int counter = 1; // For 1 and 2. assuming n is not 1 or 2.
    int i = 2;
    int x = 2;
    int tempLength = n;

    while (counter <= n) {
        for (; i <= tempLength; i++) {
            for (x = 2; x < i; x++) {
                if (i % x == 0) {
                    break;
                }
            }
            if (x == i && counter < n) {
                //System.out.printf("\n%d is prime", x);
                counter++;
                if (counter == n) {
                    System.out.printf("\n%d is prime", x);
                    return counter;
                }
            }
        }
        tempLength = tempLength+n;
    }
    return 0;
}
0
Narita
public class prime{
    public static void main(String ar[])
    {
      int count;
      int no=0;
      for(int i=0;i<1000;i++){
        count=0;
        for(int j=1;j<=i;j++){

        if(i%j==0){
          count++;
         }
        }
        if(count==2){
          no++;
          if(no==Integer.parseInt(ar[0])){
            System.out.println(no+"\t"+i+"\t") ;
          }
        }
      }
    }
}
0
shravankumar

Je peux voir que vous avez reçu beaucoup de réponses correctes et très détaillées. Je crois que vous ne le testez pas pour de très grands nombres premiers. Et votre seul souci est d’éviter d’imprimer des nombres premiers intermédiaires dans votre programme.

Un petit changement, votre programme fera l'affaire.

Gardez votre logique de la même manière et extrayez simplement la déclaration print en dehors de la boucle ..__ Casser la boucle externe après n nombres premiers.

import Java.util.Scanner;
/**
 * Calculates the nth prime number
 * @author {Zyst}
 */
public class Prime {
    public static void main(String[] args) {

        Scanner input = new Scanner(System.in);
        int n, 
            i = 2, 
            x = 2;

        System.out.printf("This program calculates the nth Prime number\n");
        System.out.printf("Please enter the nth prime number you want to find:");
        n = input.nextInt();

        for(i = 2, x = 2; n > 0; i++) {
            for(x = 2; x < i; x++) {
                if(i % x == 0) {
                    break;
                }
            }
            if(x == i) {
                n--;
            }
        }
        System.out.printf("\n%d is prime", x);

    }
}
0
Nitesh

Bien que de nombreuses explications correctes et détaillées sont disponibles. mais voici ma mise en œuvre C:

#include<stdio.h>
#include<conio.h> 

main()
{
int pk,qd,am,no,c=0;
printf("\n Enter the Number U want to Find");
scanf("%d",&no);
for(pk=2;pk<=1000;pk++)
{
am=0;
for(qd=2;qd<=pk/2;qd++)
{
if(pk%qd==0)
{
am=1;
break;
}}
if(am==0)
c++;
if(c==no)
{
printf("%d",pk);
break;
}}
getch();
return 0;
}
0
Kashif Faraz Shamsi

L'utilisation de Java 8 parallelStream serait plus rapide. Voici mon code pour trouver le Nième nombre premier

public static Integer findNthPrimeNumber(Integer nthNumber) {
    List<Integer> primeList = new ArrayList<>();
    primeList.addAll(Arrays.asList(2, 3));
    Integer initializer = 4;
    while (primeList.size() < nthNumber) {
        if (isPrime(initializer, primeList)) {
            primeList.add(initializer);
        }
        initializer++;
    }
    return primeList.get(primeList.size() - 1);
}

public static Boolean isPrime(Integer input, List<Integer> primeList) {
    return !(primeList.parallelStream().anyMatch(i -> input % i == 0));
}

@Test
public void findNthPrimeTest() {
    Problem7 inputObj = new Problem7();
    Integer methodOutput = inputObj.findNthPrimeNumber(100);
    Assert.assertEquals((Integer) 541, methodOutput);
    Assert.assertEquals((Integer) 104743, inputObj.findNthPrimeNumber(10001));
}
0
Anuj