【问题标题】:Prime Number Programme not working质数计划不起作用
【发布时间】:2015-07-29 20:37:25
【问题描述】:

我想创建一个程序来显示质数,其中质数的索引由用户输入。基本上,第 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;
            }
        }

    }
}

【问题讨论】:

  • 程序怎么不工作了?
  • 试试我的答案,性能更好

标签: java algorithm numbers bluej


【解决方案1】:

我错了

    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;
            }
        }

    }
}

这是有效的,但感谢您的帮助

【讨论】:

  • 您应该编辑您的答案以解释(为了其他读者的利益)您所做的更改使其正常工作。您还应该将您的答案(或其他人的答案,如果它为您提供解决问题所需的洞察力)标记为解决方案。
【解决方案2】:

我更喜欢创建包含素值和素值索引的 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;
                        }
                    }
                }
            }


        }


    }
}

【讨论】:

  • 您的代码错误。您的代码说第三个素数是“4”,第六个素数是“9”(显然不是素数)。它也没有回答“我的代码有什么问题”的问题
【解决方案3】:

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

尝试这样做。我用boolean flag 替换了您的变量k,每次i%j == 0 时我将其设置为false,即j 除以i(表示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&lt;Math.sqrt(i);j++),因为要检查主要条件,您不需要检查超出 sqrt(i),因为之后因素会重复。

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

【讨论】:

    【解决方案4】:

    试试这个方法:

    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);
    

    【讨论】:

      猜你喜欢
      • 2013-12-30
      • 1970-01-01
      • 2013-12-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-19
      • 2018-03-09
      相关资源
      最近更新 更多