Java内外循环混乱?

时间:2018-04-27 06:44:41

标签: java arrays loops

我有一个函数isEvenSubset(12, 18),如果1​​8的所有偶数因子都在12的因子中,则返回1.该函数返回1表示12和18。

18 = 2,6(甚至因素) 12 = 2,4,6(偶数因子)

我的代码如下:

public static void main(String[] args) {

    System.out.println(isEvenSubset(12, 18));
}

static int isEvenSubset(int m, int n) {
    int a=0;
    int factn=0;
    for (int i = 1; i <n; i++) {


        int factm=0;
        for (int j = 1; j <m; j++) {
            if(n%i==0&&i%2==0&&factm!=0){
                factn=i;
                System.out.println(factn+" "+factm);
                if(factn==factm){
                    a=1;
                }
                }
            if(m%j==0&&j%2==0){
            factm=j;                
            }                       
        }           
    }
    return a;
}

结果与预期不符。我很困惑在代码中我应该检查factn==factm。如果在这里使用内环和外环适合或者我应该寻找任何其他方法,有人可以给我一些提示。

3 个答案:

答案 0 :(得分:1)

这里根本不需要嵌套循环,并且过于复杂。您想知道数字n的所有偶数因子是否是另一个数字m的偶数因子的子集。像这样接近它:

  1. 浏览所有偶数(2, 4, 6, 8, 10, ...)m
  2. 检查您的n是否可以被它分割。
    1. 如果是,请检查m是否不能被它分割。如果是这种情况,请返回false。
  3. 你完成了。这是一个简单的3步算法。在代码中它可能如下所示:

    for (int f = 2; f < m; f += 2)
    {
        if (n % f == 0 && m % f != 0)
        {
            return false;
        }
    }
    return true;
    

    这绝对不是一个完全优化的版本,可能甚至不接近它。甚至还有更简单的解决方案来解决您的问题。然而,它仍然远没有你想要的那么复杂。

答案 1 :(得分:0)

您的算法的时间复杂度为O(n ^ 2),非常糟糕。

我创建一个函数来计算数字的偶数因子并将它们返回数组。

所以你的main应该调用两次该函数,返回两个数组。然后你应该检查m的所有数字是否都包含在n&#39; s中。时间复杂度为O(n)。

答案 2 :(得分:0)

你混淆了自己因为你的算法太复杂了。

只循环0和第一个数字(此处为18)之间的所有偶数。对于每一个检查它是否划分第一个数字(18)。如果是,请检查它是否也划分第二个数字(12)。如果分割第一个的不分割第二个,则退出并返回0(或假)。如果到达循环的末尾,则第一个数字的所有偶数除法器也会除以第二个数字,因此返回1(或为真)。

static int isEvenSubset(int firstNumber, int secondNumber) {
    for (int i=2; i<firstNumber; i+=2) {
        if(firstNumber%i == 0) {
           if(secondNumber%i !=0) {
               return false;
           }
        }
    }
    return true;
}