Java中的素数
我试图确定数组中的素数: 我在主要方法中做错了什么 我应该换什么 这个算法好吗 请帮帮我!我刚开始学习java,我真的想知道越来越多的事情DJava中的素数,java,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;
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;
}
}
包素数;
导入java.util.Scanner;
公共类素数类{
专用静态扫描仪输入;
公共静态void main(字符串[]args){
int[]arr=新int[100];
int n;
输入=新扫描仪(System.in);
n=input.nextInt();
对于(int i=1;i我不确定其他一切是否正常,但我会像这样更改isPrimeNum
-
public static boolean isPrimeNum(int n) {
for(int j = 2; j < n; j++) {
if(n % j == 0) {
return false;
}
}
return true;
}
public静态布尔isPrimeNum(int n){
对于(int j=2;j
每当你发现一个j
大于1
小于n
,它可以在不给余数的情况下除以n
,你可以说n
不是素数。你为什么要使用数组?我看不出有任何意义
n%1
始终为0,因此您可以跳过编号0
,也可以跳过编号n
,因为n%n
也始终为0
当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;
如果(n%2==0)返回false;//检查为偶数
对于(int j=3,m=(int)Math.sqrt(n);j首先,不需要从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;
for(int j=2;j以下是我关于代码的观点:
- 在
main
方法中,在索引位置1处启动for
-循环。数组中的第一个索引位置是0
- 同样,main方法中的
for
-循环:行isPrime(arr[i]);
应该给您一个编译错误,因为该方法需要数组而不是int
- 为什么不将任务分成两部分呢?任务一包括将用户输入读入数组,任务二确定素数
尝试将您的主要方法更改为这样,iPrime处于循环之外:
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);
}
publicstaticvoidmain(字符串[]args){
int[]arr=新int[100];
int n;
输入=新扫描仪(System.in);
n=input.nextInt();
对于(int i=1;我认为你的代码实际上是有效的,这类问题更适合。你的代码有什么问题吗?或者你只是需要提高它的效率吗?你用m做什么?@JohannesH。说得好,修正了代码。顺便说一句,每2个数字跳过一次是没有必要的,如果2除以n,你已经返回了。我实际上想到了这一点也有耳鼻喉科,但由于某种原因,我再也看不见了。我决定不使用耳鼻喉科。请在下面编辑我的答案(基本上与您所做的相同,只是稍加解释)以将其包括在内。@JohannesH。您可以按6组(跳过3的倍数)或30组(也跳过5的倍数)对其进行进一步优化但它变得越来越复杂。跳过evens技巧只会添加一行代码。
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);
}