我有一个函数isEvenSubset(12, 18)
,如果18的所有偶数因子都在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
。如果在这里使用内环和外环适合或者我应该寻找任何其他方法,有人可以给我一些提示。
答案 0 :(得分:1)
这里根本不需要嵌套循环,并且过于复杂。您想知道数字n
的所有偶数因子是否是另一个数字m
的偶数因子的子集。像这样接近它:
(2, 4, 6, 8, 10, ...)
至m
。n
是否可以被它分割。
m
是否不能被它分割。如果是这种情况,请返回false。你完成了。这是一个简单的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;
}