-1

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

我在主要方法中做错了什么?

我应该改变什么?

算法还好吗?

请帮帮我!我刚开始学习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;
}
}
4

5 回答 5

1

你为什么要使用数组?我认为拥有它没有任何意义。

n%1始终为 0,因此您可以跳过数字,0也可以跳过始终为 0 的数字。nn%n

您的 isPrimeNum 可以在找到 >=2 且 < n 的匹配项后立即返回 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;
于 2013-11-03T20:34:40.163 回答
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不是素数。

于 2013-11-03T20:33:57.723 回答
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;
于 2013-11-03T20:34:51.890 回答
0

以下是我关于代码的观点:

  • main方法中,您从for索引位置 1 开始 -loop。数组中的第一个索引位置是 0。
  • 再次是formain 方法中的 -loop:该行isPrime(arr[i]);应该给您一个编译错误,因为该方法需要一个数组而不是 int。
  • 你为什么不把你的任务一分为二呢?任务一包括将用户输入读入一个数组,任务二确定素数。
于 2013-11-03T20:36:10.230 回答
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);
}
于 2013-11-03T20:36:36.927 回答