为什么一个代码工作而另一个代码不工作?

时间:2013-11-18 18:22:24

标签: java

我尝试makeBricks problem on codingbat.com如下:

  

我们想制作一排长达一英寸的砖块。我们有一个   小砖块(每块1英寸)和大砖块(每块5英寸)。   如果可以通过选择来实现目标,则返回true   给砖块。

如果我只是运行一个测试,哪些方案不起作用(代码A),代码将通过所有编码运行测试。

代码A

return(!( goal > (small+(big*5))  ||  (goal % 5 > small) )); 

另一方面,如果我想将它拖出来并测试砖块组合工作的所有可能情况(代码B),代码会通过codingbat上的所有测试,除了最后一个只说&# 34;其他测试。"由于我不知道这些其他测试是什么,我很难理解为什么Code B不起作用。有什么想法吗?

代码B

int allBigSize = big*5;

if(goal > (small+(big*5))  ) return false; //tests all small and big

if(small >= goal) return true; //tests only small

if((big*5) >= goal && goal%5 == 0) return true; //tests only big

if((big*5) % (goal-small) == 0) return true; //tests combo of big and small

else {
    return(small >= Math.abs((goal-(big*5))-small));
}

1 个答案:

答案 0 :(得分:2)

我没有动力写第二个版本;它不会处理更多情况,只会增加冗余(和错误)。

将第一个版本转换为更易读的形式(Eclipse可以自动执行此操作,只需按Ctrl + 1并选择“推迟否定”和“删除额外的括号”)我们得到:

    return goal<=small+big*5 && small >= goal%5;

现在将它与你的第二种形式进行比较:

if(goal > (small+(big*5))  ) return false; //tests all small and big

这与您的第一个表单的第一个字词相同:goal<=small+big*5是必需的。

if(small >= goal) return true; //tests only small

这是由您的第一个变体处理:只检查big为零时会发生什么,当true大于零时它会保持big

if((big*5) >= goal && goal%5 == 0) return true; //tests only big

现在检查当small为零时会发生什么,然后检查它是否大于零:您的第一个变体已经涵盖了这一点。

if((big*5) % (goal-small) == 0) return true; //tests combo of big and small

现在出现错误:这意味着什么?嗯,很可能你想表达的东西比你的第一个变种表达的那样,但这次你失败了。

else {
    return(small >= Math.abs((goal-(big*5))-small));
}

在这里,我迷路了。我不知道你甚至想要表达什么......