我尝试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));
}
答案 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));
}
在这里,我迷路了。我不知道你甚至想要表达什么......