使用用户输入检查Java Prime Number

时间:2017-10-22 18:37:01

标签: java input numbers controls

我刚刚开始为大学编写代码,我必须编写一个程序来检查用户输入(整数)是否为素数。

我一直在取得好成绩,但我想问你的意见以及我是否遗忘了什么。

package uebung_3;


import java.util.Scanner;

public class PrimZahlen {

    public static void main(String[] args) {

        System.out.print("Enter a number: ");
        Scanner key = new Scanner(System.in);
        int in = key.nextInt();

        prim(in);
    }

    private static void prim(int in) {//int in is a Scanner var.
        if (in == 2 || in == 3) {

            System.out.println(in + " is a prime number");
        } else if (in == 5 || in == 7) {
            System.out.println(in + " is a prime number");
        } else if (in % 2 == 0 || in % 3 == 0) {
            System.out.println(in + " is not a prime number.");
        } else if (in % 5 == 0 || in % 7 == 0) {
            System.out.println(in + " is not a prime number.");
        } else {
            System.out.println(in + " is a prime number.");
        }
    }

}

6 个答案:

答案 0 :(得分:2)

你知道这个号码只有2个设计者(1和他自己)。

例如:

if (pythagorasTheorem(a,b,c))
{
    cout << "This is a right-angle triangle " << endl;
}

可以优化迭代范围(从2到i ^ 2 <= n)

答案 1 :(得分:2)

你可以用更加数学的方式做到这一点,而不仅仅是检查到素因子7。 这是我的解决方案:

public static void main(final String[] args) {
    System.out.print("Enter a number: ");
    final Scanner key = new Scanner(System.in);
    final int in = key.nextInt();

    if (isPrime(in)) {
        System.out.println(in + " is a prime number");
    } else {
        System.out.println(in + " is not a prime number");
    }
}

private static boolean isPrime(final int in) {
    if (in < 2) return false;

    for (int i=2; i <= Math.sqrt(in); i++){
        if (in%i == 0){
            return false;
        }
    }
    return true;
}

答案 2 :(得分:1)

素数只有2个除数1和数字本身。因此,要检查数字是否为素数,您必须检查该数字的所有可能除数。 例如:

boolean isPrimeNumber(int num){
    if(num < 2)
        return false;
    for(int i = 2; i <= Math.sqrt(num); i++){
        if(num % i == 0){
            return false;
        }
    }
    return true;
}

答案 3 :(得分:1)

primality test上的维基百科条目提供了比目前为止提供的更好的测试算法,我们可以在Java中轻松实现它,如

private static boolean isPrime(int n) {
    if (n <= 1) {
        return false;
    } else if (n <= 3) {
        return true;
    } else if (n % 2 == 0 || n % 3 == 0) {
        return false;
    }
    int sq = (int) Math.ceil(Math.sqrt(n));
    for (int i = 5; i <= sq; i += 6) {
        if (n % i == 0 || n % 2 + i == 0) {
            return false;
        }
    }
    return true;
}

并更改您的main方法以使用它,例如

// prim(in);
if (isPrime(in)) {
    System.out.printf("%d is prime.%n", in);
} else {
    System.out.printf("%d is not prime.%n", in);
}

答案 4 :(得分:0)

您的计划不正确。这是正确的实现,现在检查从负无穷大到无穷大的所有整数,将1视为非素数:

{{1}}

答案 5 :(得分:0)

最大的问题是你没有检查大于7的素数因子;这意味着您将开始为n >= 121得到错误的答案。

仅仅因为其他人基本上都提出了相同的算法,这是另一个易于实现的算法:Sieve of Eratosthenes

boolean isPrime(int n) {
  if (n <= 0) return false;

  // sieve is basically a boolean[], where each element will
  // contain "true" if the number is prime, "false" otherwise.
  BitSet sieve = new BitSet(n + 1);
  sieve.set(0, n + 1);

  // Zero isn't prime, nor is 1.
  sieve.clear(0); sieve.clear(1);

  for (int i = 2; i <= n; ++i) {
    if (sieve.get(i)) {
      // i is a prime number.
      // Mark all multiples of i as non-prime.
      for (int j = 2 * i; j <= n; j += i) {
        sieve.clear(j);
      }
    }
  }

  // n is prime if the corresponding element in the sieve is "true".
  return sieve.get(n);
}

请注意,您可以通过这种方式对此进行考虑,以便您可以重复使用sieve BitSet来对方法进行多次调用(具体来说,您可以再次使用它来获取较小的{{1}值}})。