我正在尝试确定数组中的素数:
主要方法我做错了什么?
我应该改变什么?
算法是否更好?
请帮帮我!我刚开始学习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;
}
}
答案 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);
}