2013-11-18 9 views
0

Я пытать makeBricks problem on codingbat.com следующим образом:Почему один код работает, но не другой?

Мы хотим сделать ряд кирпичей, который цель дюймов в длину. У нас есть количество маленьких кирпичей (по 1 дюйм каждый) и большой кирпич (по 5 дюймов каждый). Возвратите true если можно сделать цель, выбрав из данные кирпичи.

Если я просто запускаю тест, для которого сценарии НЕ будут работать (код А), код передает все тесты запуска codingbat.

Код

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

Если с другой стороны, я хочу, чтобы перетащить его и проверить его на все возможные сценарии, в которых комбинация кирпича будет работать (Код B), код проходит все тесты на за исключением последнего, который только говорит «другие тесты». Поскольку я не знаю, что это за другие тесты, я в тупике, почему 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)); 
} 
+6

Почему один код какой? – nhgrif

+0

Что значит «это не работает»? Каковы ваши ожидаемые результаты и результаты? –

+0

@nhgrif: «Делайте, или нет. Нет« почему ». – usr2564301

ответ

2

Я не понимаю вашу мотивацию для написания второго варианта; он не обрабатывает больше случаев, он просто добавляет избыточность (и ошибки).

При преобразовании первой версии в более удобном для восприятия виде (Eclipse, может сделать это автоматически, просто нажмите Ctrl + 1 и выберите «Push отрицанием вниз» и «Удалить лишние скобки») мы получили:

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)); 
} 

И здесь я потерян. Я понятия не имею, что вы даже хотел, чтобы выразить ...

Смежные вопросы