Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/384.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中的素数_Java - Fatal编程技术网

Java中的素数

Java中的素数,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;

我试图确定数组中的素数:

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

我应该换什么

这个算法好吗

请帮帮我!我刚开始学习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;
}
}
包素数;
导入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);
}