质数计划不起作用

Prime Number Programme not working

我想创建一个程序来显示素数,其中素数的索引由用户输入。基本上第 n 个素数将显示在用户输入 n 的位置。但是该程序无法正常工作,我们将不胜感激任何帮助。代码写在下面,谁能告诉我它有什么问题吗?

import java.io.*;
public class Nth_Prime
{
    public static void main()throws Exception
    {
        BufferedReader stdin = new BufferedReader(new InputStreamReader(System.in));
        System.out.println("Which Prime number would you like to find?");
        int n = Integer.parseInt(stdin.readLine());
        int k = 0;
        int counter = 1;
        int num=0;

    for(int i=3;i<100;i++)
    {
        k=0;
        for(int j=2;j<i;j++)
        {
            if(i%j!=0)
            {
                k++;
            }
        }    
        if(k!=0)
        {
            num=i;
            counter++;
        }
        if(counter==n)


           {
                System.out.println("The number is: "+num);
                break;
            }
        }

    }
}

为什么你的代码是错误的(给出错误的输出) :: 当 i25 时,你的内部 for 循环将递增 kj = 2, 3, 7 ... 和退出内部 for 循环后,您的 if 条件 if(k!=0) 检查,因此对于 25 您的 k 应该是在 22 附近的某处,所以你甚至将 25 算作素数(这是错误的)。

尝试这样做。我用 boolean flag 替换了你的变量 k,每次 i%j == 0 时我都将其设置为 false,即 ji(表示i 不是素数,因此不计算在内)。

for(int i=3;i<100;i++)
{
    boolean flag = true;
    for(int j=2;j<i;j++)
    {
        if(i%j==0)
        {
            flag = false;
            break;
        }
    }    
    if(flag)
    {
        num=i;
        counter++;
    }
    if(counter==n)
    {
            System.out.println("The number is: "+num);
            break;
    }
}

少量优化::

1) 您可以考虑将第二个 for 循环更改为 for(int j=2;j<Math.sqrt(i);j++),因为要检查主要条件,您不需要检查超出 sqrt(i),因为在那之后因素会重复。

2) 您应该考虑使用 Sieve of Eratosthenes 作为寻找素数的最佳方法。

我弄错了

    import java.io.*;
public class Nth_Prime
{
    public static void main()throws Exception
    {
        BufferedReader stdin = new BufferedReader(new InputStreamReader(System.in));
        System.out.println("Which Prime number would you like to find?");
        int n = Integer.parseInt(stdin.readLine());
        int k = 0;
        int checker = 0;
        int counter = 1;
        int num=0;

        for(int i=3;;i++)
        {
            k=0;
            checker=0;
            for(int j=2;j<i;j++)
            {
                if(i%j==0)
                {
                    checker++;
                }
            }    

            if(checker==0)
            {
                k++;
            }
            if(k!=0)
            {
                num=i;
                counter++;
            }
            if(counter==n)
            {
                System.out.println("The number is: "+num);
                break;
            }
            else
            {
                continue;
            }
        }

    }
}

这是有效的,但感谢你们的帮助

试试这个方法:

int num, count, i;
        num=1;
        count=0;
        while (count < nth){

            num=num+1; //find the next prime number 
            for (i = 2; i <= num; i++){

                if (num % i == 0) {

                    break; //prime not found
                }
            }
            if ( i == num){

                count = count+1; //prime found
            }
        }
System.out.println("The number is: "+num);

我更喜欢创建包含 prime value 和 prime value 索引的 HashMap,试试这个小应用程序:

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.HashMap;

public class Nth_Prime {

    static boolean checkPrime(int n)
    {
        for (int i=2;i<n;i++)
        {
            if(n%i==0)
                return false;
        }
        return true;
    }
    static HashMap<Integer,Integer> map=new HashMap<Integer, Integer>();
    public static void main(String[] args) throws Exception {
        BufferedReader stdin = new BufferedReader(new InputStreamReader(
                System.in));
        map.put(1, 2);
        System.out.println("Which Prime number would you like to find?");
        while(true)
        {
            int n = Integer.parseInt(stdin.readLine());
            if( n<0)
                return;
            if(map.containsKey(n))
            {
                System.out.println("The number is: " + map.get(n));

            }
            else
            {
                int size=map.size();
                int lastKey=size;//(int) map.keySet().toArray()[size-1];
                int lastValue=map.get(lastKey);
                for (int i = lastValue; i < 1000; i++) {

                    if(checkPrime(i))
                    {
                        map.put(size, i);
                        size++;
                        if(map.containsKey(n))
                        {
                            System.out.println("The number is: " + map.get(n));
                            System.out.println("Which Prime number would you like to find?");
                            break;
                        }
                    }
                }
            }


        }


    }
}