Java 检查一个数字是否为素数的代码有什么错误?

Java 检查一个数字是否为素数的代码有什么错误?,java,arrays,Java,Arrays,我试图将数组发送给方法,检查数组的整数值是否为素数,然后将所有素数存储在新数组中并发送回 import java.util.Arrays; public class FunPrime { public static int[] calculate(int[] arr) { int arr2[] = {}; int count = 0; for (int i = 0, m = 0; i < arr.length; i++) {

我试图将数组发送给方法,检查数组的整数值是否为素数,然后将所有素数存储在新数组中并发送回

import java.util.Arrays;

public class FunPrime {

    public static int[] calculate(int[] arr) {
        int arr2[] = {};
        int count = 0;

        for (int i = 0, m = 0; i < arr.length; i++) {
            for (int j = 1; j <= arr[i]; j++) {
                if (arr[i] % j == 0) {
                    count++;
                }
                if (count > 2)
                    break;
            }
            if (count <= 2) {

                arr2[m] = arr[i];
            }
        }
        return arr2;
    }

    public static void main(String args[]) {
        int no[] = { 1, 4, 5, 6, 7, 8, 11, 22, 43 };
        System.out.println(Arrays.toString(calculate(no)));
    }
}

用零元素初始化第二个数组

 int arr2[] = {};

不要增长,因为没有第一个元素,所以arr2[0]=someValue将为您提供一个数组。

创建新数组时,应指定其大小

int arr2[] = {};
这将创建一个大小为0的数组。您可能会得到一个ArrayIndexOutOfBoundsException

您确实希望在开始使用引用之前使用new来分配内存。我也认为你们可以去掉x=x和x=1;然后,您可以通过中断来停止循环。那应该更快。差不多

for (int y = 2; y < x; y++) if (x % y == 0) { result = true; break; }

这是你的解决方案。这会打印出来

[1,5,7,11,43]

如果我们写

int array = new int [10] ;
然后它是一个动态初始化,而不是静态的。因此,您需要通过以下方式静态分配内存:

int array = { 1, 4, 5, 6, 7, 8, 11, 22, 43 };
此外,如果将来要将数组初始化为零,则可以使用

int arr[] = new int[10];
for(int i=0;i<arr.length;i++)
arr[i] = 0;

至少有三件事不对

首先

正在创建一个空数组,没有位置可用于存储任何内容,这意味着您尝试访问其中的任何元素时,将获得ArrayIndexOutOfBoundsException

您应该将数组初始化为所需的长度,例如

int arr2[] = new int[arr.length];
for (int i = 0, m = 0; i < arr.length; i++) {
    count = 0;
    for (int j = 1; j <= arr[i]; j++) {
arr2[m] = arr[i];
m++;
[1, 5, 7, 11, 43, 0, 0, 0, 0]
int m = 0;
for (int i = 0; i < arr.length; i++) {
int[] arr3 = new int[m];
System.arraycopy(arr2, 0, arr3, 0, m);
return arr3;
两个

count的值在使用后不会重新初始化,这意味着它在每个循环中不断递增,这意味着它将只能报告第一次成功匹配,相反,您应该在每个循环中将计数初始化回0,例如

int arr2[] = new int[arr.length];
for (int i = 0, m = 0; i < arr.length; i++) {
    count = 0;
    for (int j = 1; j <= arr[i]; j++) {
arr2[m] = arr[i];
m++;
[1, 5, 7, 11, 43, 0, 0, 0, 0]
int m = 0;
for (int i = 0; i < arr.length; i++) {
int[] arr3 = new int[m];
System.arraycopy(arr2, 0, arr3, 0, m);
return arr3;
奖金

问题是,对于不匹配的元素,这将返回0,例如

int arr2[] = new int[arr.length];
for (int i = 0, m = 0; i < arr.length; i++) {
    count = 0;
    for (int j = 1; j <= arr[i]; j++) {
arr2[m] = arr[i];
m++;
[1, 5, 7, 11, 43, 0, 0, 0, 0]
int m = 0;
for (int i = 0; i < arr.length; i++) {
int[] arr3 = new int[m];
System.arraycopy(arr2, 0, arr3, 0, m);
return arr3;
这可能并不理想

您可以使用System.arraycopy修剪结果,但首先需要做一个小的更改。m值表示匹配的数量,这很有用,但是因为它是在for循环中声明的,所以我们不能在for循环之外访问它,所以您需要在for循环之外声明它,例如

int arr2[] = new int[arr.length];
for (int i = 0, m = 0; i < arr.length; i++) {
    count = 0;
    for (int j = 1; j <= arr[i]; j++) {
arr2[m] = arr[i];
m++;
[1, 5, 7, 11, 43, 0, 0, 0, 0]
int m = 0;
for (int i = 0; i < arr.length; i++) {
int[] arr3 = new int[m];
System.arraycopy(arr2, 0, arr3, 0, m);
return arr3;
现在将输出

[1, 5, 7, 11, 43]
而不是

[1, 5, 7, 11, 43, 0, 0, 0, 0]

您告诉我们您的代码有什么问题您将arr2设置为0大小,因此无法向其添加任何数字;j使用arraylist而不是Array,但您的答案不是answer@ImmerAllein这个问题不是问题是的,是的。如你所见。。和这表明它是一个question@ImmerAllein哦,哈哈,标题。@ImmerAllein,更好吗?问题是“这段代码有什么问题”,而不是“应该如何解决这个问题”;