数组内的除数

时间:2014-12-05 19:32:13

标签: java arrays algorithm loops

我需要编写一个方法,它接受一个整数数组并检查每个元素,如果它的所有除数(数字本身和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);
        }
}

2 个答案:

答案 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。