Java中的素数

时间:2013-11-03 20:28:45

标签: java

我正在尝试确定数组中的素数:

主要方法我做错了什么?

我应该改变什么?

算法是否更好?

请帮帮我!我刚开始学习java,我真的想知道越来越多的东西! :d

package prime;

import java.util.Scanner;

public class primeClass {

private static Scanner input;

public static void main(String[] args){
    int[] arr=new int[100];
    int n;
    input=new Scanner(System.in);
    n=input.nextInt();
    for(int i=1;i<=n;i++){
        arr[i]=input.nextInt();
        isPrime(arr[i]);
    }

}
public static void isPrime(int[] arr){
    for(int i=0;i<arr.length;i++)
        if(isPrimeNum(arr[i])){
            System.out.println(arr[i]);
        }
}

public static boolean isPrimeNum(int n){
    int d=0;
    for(int j=1;j<=n;j++)
        if(n%j==0)
            d++;
    if(d==2)
        return true;
    else return false;
}
}

5 个答案:

答案 0 :(得分:1)

你为什么要使用阵列?我认为没有任何意义。

n%1始终为0,因此您可以跳过号码0,也可以跳过号码n,因为n%n也始终为0。

您的isPrimeNum可以在找到&gt; = 2且&lt;的匹配时返回true。 ñ。更短的搜索是

在2

之后执行一半检查
if (n % 2 == 0) return false; // check is even
for(int j = 3, m = (int) Math.sqrt(n); j <= m; j += 2) // skip all the even.
    if(n % j == 0)
       return false;
return true;

要进一步优化此功能,您可以执行以下操作。这将在3之后进行1/3的检查。

if (n % 2 == 0 || n % 3 == 0) return false; // check is even + 3x
for(int j = 5, m = (int) Math.sqrt(n); j <= m; j += 6) { // skip even + 3x
    if(n % j == 0)
       return false;
    if(n % (j + 2) == 0)
       return false;
}
return true;

答案 1 :(得分:0)

不确定其他一切是否正常,但我会像这样更改isPrimeNum .-

public static boolean isPrimeNum(int n) {
    for(int j = 2; j < n; j++) {
        if(n % j == 0) {
            return false;
        }
    }
    return true;
}

每当您发现j大于1且小于n且可以除n而不给出余数时,您可以说n不是素数。

答案 2 :(得分:0)

首先,不需要将j计数到n。计算到达sqrt(n)就足够了 第二,在2处开始j就足够了。每个数字可以除以1,所以检查它是没有意义的 第三,你不应该计算所有可以除以n的数字,而只是停留在你找到的第一个数字上 最后但并非最不重要:如果2没有划分n,则没有偶数,所以你可以跳过这些。 (谢谢@PeterLawrey)

代码现在是:

for (int j = 2; j <= Math.sqrt(n); j+=2) {
    if (n%j) return false;
}
return true;

答案 3 :(得分:0)

以下是关于代码的要点:

  • main方法中,您在索引位置1处开始for - 循环。数组中的第一个索引位置为0.
  • 主方法中的for - 循环:行isPrime(arr[i]);应该给出编译错误,因为方法需要数组而不是int。
  • 你为什么不把你的任务分成两部分?任务一包括将用户输入读入数组,任务二确定素数。

答案 4 :(得分:0)

尝试将main方法更改为如下所示,在循环外使用isPrime:

public static void main(String[] args){
    int[] arr=new int[100];
    int n;
    input=new Scanner(System.in);
    n=input.nextInt();
    for(int i=1;i<=n;i++){
        arr[i]=input.nextInt();
        }
    primeClass.isPrime(arr);
}