Java 数组中的除数

Java 数组中的除数,java,arrays,algorithm,loops,Java,Arrays,Algorithm,Loops,我需要编写一个方法,它接受一个整数数组,并检查每个元素的所有除数(数字本身和1除外)是否都存在于该数组中。如果是,该方法将返回true 例如,以下数组将返回true: 4,5,10,2 我想不出什么有效的方法来实施。你们能帮帮我吗 我一直在考虑遍历数组中的每个元素,搜索它的所有因子,将它们放在数组中,返回数组,然后与原始数组中的元素进行比较 这是一个可能的解决方案,它可以工作,但我想知道其他可能的解决方案 编辑:这里有一个代码,我已经想出了,但它是超慢。你们能帮我优化一下吗 import ja

我需要编写一个方法,它接受一个整数数组,并检查每个元素的所有除数(数字本身和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);
        }
}
导入java.util.array;
公共类除数{
公共静态void main(字符串[]args){
int[]数={4,5,10,2};
布尔标志=真;
for(整数:数字){
如果(数量%2!=0){
对于(int subNum=1;subNum
我认为以下算法可以解决您的需要。我已经在几个案例中进行了测试,它似乎很有效。 例如,阵列:

int[] set = {2, 3, 4, 5, 7, 10, 11, 15, 18, 35};  
立即执行,给出“true”的答案。尝试删除将给出“false”答案的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);
        }

    }
}
私有静态布尔约简(int[]集,int索引,int因子){
//注意:集合必须是已排序的整数集合
if(index==set.length){
返回true;
}否则{
整数除数=集合[索引];
if(除数!=1){
if(除数<因子)返回false;
for(int i=索引;i

看看它是否有效,如果遇到任何问题,请告诉我

1.遍历数组中的每个元素 2.在循环中查找它的除数
3.执行2)时,检查数组中是否包含每个除数。If false-return false。

我想不出足够有效的方法来实现。你们能帮我解决这个问题吗?从一些低效的方法开始,在代码审查时分享代码,他们会帮助你做得更好。如果您确实尝试了一些东西,但它不起作用,请在此处共享该代码以及您遇到的错误。将所有元素放入
树集合
,找到每个元素的所有除数(也可以将它们放入
集合
),检查是否存在。集合具有良好的查找/交集性能。@9000这也需要太多时间=\@LuiggiMendoza:在定义优化目标之前,很难判断如何使代码(什么代码?)更高效。首先配置文件,然后进行优化。若只处理非常短的小整数数组,缓存一致性可能会使数组扫描方式比处理树更有效。如果您的数字很少重复,排序和二进制搜索会更好。更不用说缓存用于因子分解的素数了。诚然,这个问题太模糊了,无法给出正确的答案。好吧,我在这篇文章中添加了一个我想出的代码。它相当慢,所以肯定需要优化。你们能看一看吗?我试着按照你们的建议去做,但代码非常慢(对于一个只有4个元素的数组,判断是真是假需要5秒钟)。我把它添加到了帖子里。你能看一下吗?