【问题标题】:Finding prime numbers in Java在Java中查找素数
【发布时间】:2013-10-20 21:48:26
【问题描述】:

我有一个检查素数然后显示它们的 java 代码。但是,在某些情况下没有素数(例如 14 - 17 之间)。在这些情况下,我希望显示一条消息。例如"No primes found"。我不知道如何将它添加到我的代码中。

这是我的整个班级:

import java.io.*;

public class Prime {

    BufferedReader input = new BufferedReader(new InputStreamReader(System.in));

    public static int lowerBound;
    public static int higherBound;

    public void getInput() throws IOException {
        System.out.println("Please enter the lower and upper bound");
        String line1 = input.readLine();
        String line2 = input.readLine();
        int lowInput = Integer.parseInt(line1);
        int highInput = Integer.parseInt(line2);
        lowerBound = lowInput;
        higherBound = highInput;
    }

    public void validatedata() throws IOException {
        do {
            getInput();
            if (lowerBound < 2) {
                System.out.println("Finish");
                break;
            } else if (higherBound < lowerBound) {
                System.out
                        .println("The upper bound should be at least as big as the lower bound.");
            }

        } while (higherBound < lowerBound);

    }

    public void prime_calculation() throws IOException {
        while ((lowerBound >= 2) && (higherBound > lowerBound)) {

            int k;
            for (k = lowerBound; k < higherBound; k++) {
                boolean primecheck = true;
                for (int j = 2; j < k; j++) {
                    if (k % j == 0) {
                        primecheck = false;
                    }
                }
                if (primecheck)
                    System.out.println(k);
            }
            validatedata();
        }
    }
}

这是我主要的 void 方法:

import java.io.IOException;

public class PrimeUser extends Prime {

    public static void main(String argv[]) throws IOException {
        Prime isprime = new Prime();
        isprime.validatedata();
        isprime.prime_calculation();
    }
}

【问题讨论】:

  • 好的,我喜欢你的作品,我知道这是你的第一篇文章,但你能展示整个班级吗?我可以回答这个我只需要看到整个班级。
  • 我会在 for 循环之外添加一个布尔变量(我们称之为 primesInRange),初始化为 false。然后,如果 for 循环以 primecheck 仍然为真,则通过将 if 语句更改为 if (primecheck) { System.out.println(k); primesInRange = true; }primesInRange 设置为真。然后,如果在检查完所有数字后primesInRange 仍然为假,则没有找到素数,您就会知道打印出一条消息。
  • 另外,作为一个小优化,你只需要从j = 2循环到j &lt;= k / 2。对于所有数字,没有任何因子大于n / 2,因此无需检查每个小于它的数字。

标签: java math primes prime-factoring


【解决方案1】:
ArrayList<Integer> primes = new ArrayList<Integer>();
if ((lowerBound >= 2) && (higherBound > lowerBound))
{
    int k;
    for (k = lowerBound; k < higherBound; k++)
    {
        primecheck = true;
        for (int j=2; j < k/2; j++) // you dont have to check beyond k/2, since (k/2 + 1) times anything whole number cannot be equal to k
        {
            if (k % j == 0) {
                primecheck = false;
                break; // no need for more iterations of the current number, since you already know it is not a prime
            }
        }
        if (primecheck) {
            primes.add(k);
        }
    }
} else {
    // invalid bounds
    return;
}
if (primes.size() > 0) {
    for (int num : primes) {
        System.out.println(num);
    }
} else {
    System.out.println("No primes exist");
}

// Without an array
boolean y = false;
String x = new String();
if ((lowerBound >= 2) && (higherBound > lowerBound))
{
    int k;
    for (k = lowerBound; k < higherBound; k++)
    {
        primecheck = true;
        for (int j=2; j < k/2; j++) // you dont have to check beyond k/2, since (k/2 + 1) times anything whole number cannot be equal to k
        {
            if (k % j == 0) {
                primecheck = false;
                break; // no need for more iterations of the current number, since you already know it is not a prime
            }
        }
        if (primecheck) {
            x += Integer.toString(k) + "\n";
            y = true; // yes, there exists atleast 1 prime
        }
    }
} else {
    // invalid bounds
    return;
}
if (y == true) {
    System.out.println(x);
} else {
    System.out.println("No primes exist");
}

【讨论】:

  • 您好 Vikhyath Reddy,谢谢您的回复,但我不想使用数组。我已经粘贴了我的整个代码。有人可以帮我吗?谢谢
  • @Vikhyath Reddy while ((lowerBound &gt;= 2) &amp;&amp; (higherBound &gt; lowerBound)) 这不等于while(true)吗?
  • 好吧,如果他给出一个负的下限和一个上限
  • @user2901128,您需要某种方式来记住您所看到的主要内容和未看到的内容。因为你不能说是否没有找到素数,直到你到达你感兴趣的数字范围的最后……到那时你将失去你已经看到的内容的上下文。
  • @VikhyathReddy:你检查输入是对的,但你为什么要使用一段时间?应该是如果。
【解决方案2】:

假设 2 和 3 是已知素数: 将在不到 900 毫秒的时间内找到 100 万个素数

公共类 FindPrime { 私有整数 [] arr_num = 新整数 [1000000];

    private void arr_init()
    {
        for(int i=0; i< arr_num.length; i++)
        {
            arr_num[i] = i;
        }
    }

    private void find_prime()
    {
        for (int i=3; i<arr_num.length; i++)
        {
            find_prm(arr_num[i]);
        }
    }

    private void find_prm(Integer chk_prm)
    {
        boolean isprime = false;
        if(chk_prm == null)
            return;

        if(chk_prm %2 !=0 )
        {
            double sqrt = Math.sqrt(chk_prm);
            for(Integer k=arr_num[2]; (k!= null) && (k<sqrt + 1)  ; k++)
            {
                if(chk_prm % k == 0)
                {
                    isprime=false;
                    break;
                }
                else
                    isprime = true;
            }
        }
        else
        {
            setNull(chk_prm);
        }
        if(!isprime)
        {
            setNull(chk_prm);
        }
    }

    private void setNull(int num_to_null)
    {
        arr_num [num_to_null] = null;
    }

    private void print_prime()
    {
        for(int i=2; i < arr_num.length; i++)
        {
            if(null != arr_num[i])
            {
                System.out.println(arr_num[i]);
            }
        }
    }

    public static void main(String [] args)
    {
        FindPrime findPrime = new FindPrime();
        findPrime.arr_init();
        long timeStart = System.currentTimeMillis();
        findPrime.find_prime();
            long diff = System.currentTimeMillis()- timeStart;
        System.out.println("Running time :: " + diff);
    }
}

【讨论】:

    【解决方案3】:

    看看http://rosettacode.org/wiki/Miller-Rabin_primality_test#Java,它解释了如何确定一个数字是否是素数。

    然后处理您的值数组并保留一个数字是否为素数的标志。

    【讨论】:

      【解决方案4】:

      我找到了一种更简单的方法来解决这个问题。我只是添加了一个计数器来计算出现次数 素数。如果计数器等于 = 0,则显示消息。代码如下。无论如何,谢谢你的帮助,伙计们。如果我有任何问题,我会再次发布。顺便说一句,我想知道是否有人可以告诉我或分享任何来源/网页,或者只是以任何方式训练我的算法技能以寻找解决方案?

      这里是最终代码

          public void prime_calculation() throws IOException
      {   
      
          while ((lowerBound >= 2) && (higherBound > lowerBound))
          {
      
              int k;
              int m = 0;
              for (k = lowerBound; k < higherBound; k++)
              {
                  boolean primecheck = true;
                      for (int j=2; j < k; j++)
                      {
                          if (k % j == 0)
                          {
                              primecheck = false;
                          }
                      }
                          if (primecheck)
                          {               
                          System.out.println(k);
                          m++;
                          }
              }
              if (m == 0)
                  System.out.println("No primes found");
          validatedata();
          }   
      }
      

      }

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-03-23
        • 2017-01-19
        • 2016-03-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-05-07
        相关资源
        最近更新 更多