我需要编写一个方法,它接受一个整数数组并检查每个元素,如果它的所有除数(数字本身和1除外)都存在于这个数组中。如果是,则该方法将返回true。
例如,以下数组将返回true:
4,5,10,2
我无法想到能够有效实施的东西。你能帮助我吗?
我一直在想迭代遍历数组中的每个元素,搜索它的所有除数,将它们放在数组上,返回数组然后与原始数组中的元素进行比较。
这是一个可能的解决方案,它可以工作,但我想知道其他可能的解决方案。
编辑:这是我提出的代码,但速度非常慢。你能帮我优化一下吗?:import java.util.Arrays;
public class Divisors {
public static void main(String[] args) {
int[] numbers = { 4, 5, 10, 2 };
boolean flag = true;
for (int num : numbers) {
if (num % 2 != 0) {
for (int subNum = 1; subNum < num / 2; num += 2) {
if(num%subNum == 0 && subNum != 1) {
if(!Arrays.asList(numbers).contains(subNum)) {
flag = false;
}
}
}
} else {
for (int subNum = 1; subNum < num / 2; num++) {
if(num%subNum == 0 && subNum != 1) {
if(!Arrays.asList(numbers).contains(subNum)) {
flag = false;
}
}
}
}
}
System.out.println("Result is: "+flag);
}
}
答案 0 :(得分:1)
我认为以下算法可以满足您的需求。我已经在一些案例上测试了它,它似乎工作。 例如数组:
int[] set = {2, 3, 4, 5, 7, 10, 11, 15, 18, 35};
立即执行,给出答案“真实”。尝试删除7将给出答案“假”。
你这么称呼它:
reduce(set, 0, 0)
使用的原理是通过数组递归迭代,通过每个元素对数组进行因式分解来减少数组。如果您发现一个小于最后一个因子的元素,则意味着它不能被考虑。这仅在数组已排序时有效。一旦到达数组的末尾,就会知道所有元素都已被考虑在内。
private static boolean reduce (int[] set, int index, int factor) {
// NOTE: set must be a sorted set of integers
if (index == set.length) {
return true;
} else {
int divisor = set[index];
if (divisor != 1) {
if (divisor < factor) return false;
for (int i = index; i < set.length; i++) {
while ((set[i]%divisor) == 0) {
set[i] = set[i]/divisor;
}
}
return reduce(set, index+1, divisor);
} else {
return reduce(set, index+1, factor);
}
}
}
看看它是否有效,请告诉我您是否遇到任何问题。
答案 1 :(得分:0)
1.迭代数组中的每个元素 2.找到for循环的除数 3.在执行2)时,检查每个除数是否包含在数组中。如果为false - 返回false。