如果我得到一个随机数组,它确实找到了所有素数,但是当一个数字不是素数时,它将打印0而不是跳过该数字。 这是我写过的一段代码。
public static boolean isPrime(int el) {
if (el > 1) {
for (int i = 2; i < el; i++) {
if (el % i == 0) {
return false;
}
}
return true;
}
throw new IllegalArgumentException();
}
public static int countPrimes(int[] seq) {
int C = 0;
for (int n = 0; n < seq.length; n++) {
if (isPrime(seq[n])) {
C++;
}
}
return C;
}
public static int[] primesIn(int[] seq) {
int[] Array = new int [countPrimes(seq)];
for (int i = 0; i < countPrimes(seq); i++) {
if (isPrime(seq[i])) {
Array[i] = seq [i];
}
}
return Array;
}
如果我得到以下数组:new int [] {167,173,179,191,31,89}。
它将返回:[167,173,179,0,191,31]。 我不被允许使用列表和其他东西而不是普通数组。
提前致谢!
答案 0 :(得分:0)
由于您要检查所有输入数字,但只输出素数到数组,您需要2个索引 - 一个(i
)遍历输入数组的索引,另一个( count
)遍及输出数组的索引:
int count = 0;
for (int i = 0; i < seq.length; i++) {
if (isPrime(seq[i])) {
Array[count++] = seq[i];
}
}
测试:
输入:
System.out.println (Arrays.toString (primesIn(new int[]{10, 13, 15, 17, 19, 20})));
输出:
[13, 17, 19]
答案 1 :(得分:0)
isPrime函数中存在性能问题。要找到一个不是你不需要数字的数字,你需要直到sqrt(n)
public static boolean isPrime(int el) {
if (el > 1) {
int elsqrt= sqrt(el); // EDIT we don't want to do sqrt every time
for (int i = 2; i < elsqrt; i++) {
if (el % i == 0) {
return false;
}
}
return true;
}
throw new IllegalArgumentException();
}
这使程序更快。