检查数字是否为素数的代码有什么问题?

时间:2014-04-17 07:07:02

标签: 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++) {
            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)));
    }
}

6 个答案:

答案 0 :(得分:2)

在开始使用引用之前,您确实希望使用new来分配该内存。我也认为你可以取消x = x和x = 1;然后你可以休息一下你的循环。那应该更快。像

这样的东西
for (int y = 2; y < x; y++) if (x % y == 0) { result = true; break; }

How to find number of prime numbers between two integers

答案 1 :(得分:2)

在Java中如果我们写

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;

答案 2 :(得分:2)

至少有三件事是错的......

<强>首先...

int arr2[] = {};

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

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

int arr2[] = new int[arr.length];

<强>双...

count的值在使用后永远不会重新初始化,这意味着它在每个循环中不断增加,这意味着它只能报告第一次成功匹配,相反,你应该在每个循环上将count初始化为0,例如......

for (int i = 0, m = 0; i < arr.length; i++) {
    count = 0;
    for (int j = 1; j <= arr[i]; j++) {

<强>第三...

m永远不会增加,这意味着您始终将成功匹配存储在arr2中的第一个元素位置,不要忘记增加值,例如......

arr2[m] = arr[i];
m++;

<强>加成

问题是,这会为不匹配的元素返回0,例如......

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

这可能不是理想的

你可以修剪&#34;结果使用System.arraycopy,但您需要先进行一次小修改。 m值表示匹配的数量,这很有用,但由于它在for-loop中声明,我们无法在for-loop之外访问它,因此相反,您需要在for-loop之外声明它,例如......

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]

答案 3 :(得分:1)

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

 int arr2[] = {};

Arrays不会增长,因此arr2[0] = someValue会给你一个ArrayIndexOutOfBounds,因为没有第一个元素。

答案 4 :(得分:0)

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

int arr2[] = {};

这会创建一个大小为0的数组。您可能会得到一个ArrayIndexOutOfBoundsException

答案 5 :(得分:0)

这是你的解决方案..这将打印

  

[1,5,7,11,43]

import java.util.ArrayList;

public class FunPrime {

public static ArrayList<Integer> calculate(int[] arr) {

    ArrayList<Integer> l = new ArrayList<Integer>();

    for (int i = 0; i < arr.length; i++) {
        if(isPrime(arr[i]))
        {
            l.add(arr[i]);
        }
    }
    return l;
}


static boolean isPrime(int n) {
    for(int i=2;i<n;i++) {
        if(n%i==0)
            return false;
    }
    return true;
}

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

}