找到第n个素数

时间:2015-10-12 02:25:02

标签: java primes

当我输入某些nthprime数字时,我不知道为什么我的代码无法正常工作。我试图改变我的代码几次但是对于每一个nthprime我都让它工作,我让其他人变得更糟。因此,如果我更改我的代码以使其适用于nthprime = 8,我意识到nthprime = 7并且其他一些人停止工作。任何人都可以指出我所做的具体缺陷,或者我应该重新考虑我的代码大纲。谢谢。

public class NthPrime {

public static void main(String[] args) {

    int nthprime;

    System.out.println("Enter value for n:");
    nthprime=IO.readInt();

    while(nthprime <= 0){
        System.out.println("Enter a positive value for n");
        nthprime=IO.readInt();
    }

    if(nthprime == 1){
        System.out.println("The nth prime number is: "+2);
    }
    if(nthprime == 2){
        System.out.println("The nth prime number is: "+3);
    }

    if(nthprime > 2){

    int prime=2; 
    int num=3;
    int square;
    boolean nonprime=false;

    while(prime < nthprime){
        prime++;
        num+=2;
        square = (int) Math.sqrt(num);
        for (int i=3; i <= square; i++){
            if (num % i == 0){
                nonprime=true;
                num+=2;
            }
            if(nonprime==false){
                prime++;
                num+=2;
            }
        }
    }
    System.out.println("The nth prime number is: "+num);
    }
}

}

3 个答案:

答案 0 :(得分:1)

检查此循环:

for (int i=3; i <= square; i++){
        if (num % i == 0){
            num+=2;
        }
        else {
            prime++;
            num+=2;
        }
    }

您似乎希望遍历所有奇数到您号码的平方根。如果其中一个分裂,那么它应该停止循环并将其标记为非素数。如果它没有划分任何数字,你应该将它标记为素数,但即使这应该在循环完成后完成。 (例如,当我&gt; square)

我不想给你答案,因为看起来你想要自己修复你现有的循环。但是一种策略是将它标记为非素数(在布尔值中),然后在循环之后,检查布尔值并增加素数(prime ++),如果布尔值表示它是素数。请记住重新初始化布尔值,以便在下次到达for循环时正确设置它。

答案 1 :(得分:0)

创建另一种方法来检查数字是否为素数,并使用while循环来获取素数。

public static void main(String[] args) {
    ...

    if (nthprime == 1) {
        System.out.println("The nth prime number is: 2");
    } else {
        int num = 3;

        for (int i = 2; i <= nthPrime; i++) {
            while(!isPrime(num)) {
                num += 2;
            }

            num += 2;
        }

        System.out.println("The nth prime number is: "+ (num - 2));
    }
}

private static boolean isPrime(int n) {
    int sqrt = (int) Math.sqrt(n);

    for (int i = 2; i <= sqrt; i++) {
        if (n % i == 0) {
            return false;
        }
    }

    return true;
}

答案 2 :(得分:0)

import java.util.Scanner;
public class NewNthPrime {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int t = in.nextInt();
        for(int a0 = 0; a0 < t; a0++){
            boolean flag = false;
            int n = in.nextInt();
            int[] prime = new int[n];
            prime[0] = 2;
            int i = 3,j=1;

            while(j<n){
                for(int y=0;y<prime.length;y++){
                    if(prime[y]==0){
                        break;
                    }
                    else if (i%prime[y]==0){
                       flag = true;
                       break;
                    }
                }
                if(!flag){
                   prime[j++]=i;
                }
                flag =false;
                i+=2;
            }
            System.out.println(prime[n-1]);
        }
    }
}

在这里,我声明了一个名为prime的数组,该数组存储所有素数。 while循环部分检查存储在array-prime []中的质数是否除以数字'i'(仅是奇数)。如果确实如此,则标志变为true,我们跳过下一个数字“ i”。在这里,当我还检查数组内的数字是否为零时,它会中断for循环,因为在素数数组中不能再有素数了。 现在,如果数字'i'不能被数组中的任何素数整除,则'flag'仍然为false,'i'放在数组prime []中。