Вобщем дочке моей знакомой в итоговой контрольной на дом задали задачку по математике. Смысл такой: 1 2 3 4 5 6 7 8 9 = 99 Между цифрами нужно расставить знаки ( + - * / ), причем нельзя пользоваться скобками, и чтобы в итоге получился правильный ответ. Один из ответов: 1*2+3+4+5+6+7+8*9. Таких ответов несколько. Так вот, дам плюсики тому, кто составит самый простой php код, выводящий все возможные варианты решения этой задачи.
astrologer Возможность ставить минус - подразумевает известность отрицательных чисел. dk-ne Можно побрутить правильные наборы, но это будет слишком неспортивно. Тем не менее: PHP: $znaki = array('+','-','*','/'); $znak = array('','-'); foreach ($znaki as $q) foreach ($znaki as $w) foreach ($znaki as $e) foreach ($znaki as $r) foreach ($znaki as $t) foreach ($znaki as $y) foreach ($znaki as $u) foreach ($znaki as $i) foreach ($znak as $o) { eval("\$a = {$o}1{$q}2{$w}3{$e}4{$r}5{$t}6{$y}7{$u}8{$i}9;"); if ($a == 99) printf("%18s = %d\n","{$o}1{$q}2{$w}3{$e}4{$r}5{$t}6{$y}7{$u}8{$i}9", $a); } Результат: Code: 1+2+3+4*5-6+7+8*9 = 99 1+2-3+4+5*6+7*8+9 = 99 1+2-3+4+5*6-7+8*9 = 99 -1+2*3+4+5+6+7+8*9 = 99 -1+2*3-4*5+6*7+8*9 = 99 -1+2*3*4+5+6+7*8+9 = 99 -1+2*3*4+5+6-7+8*9 = 99 -1-2+3+4+5*6+7*8+9 = 99 -1-2+3+4+5*6-7+8*9 = 99 -1-2+3*4+5+6+7+8*9 = 99 -1-2-3+4*5+6+7+8*9 = 99 -1-2-3-4+5*6+7+8*9 = 99 -1-2-3-4-5+6*7+8*9 = 99 1*2+3+4+5+6+7+8*9 = 99 1*2+3-4*5+6*7+8*9 = 99 -1*2+3*4*5+6*7+8-9 = 99 -1*2+3*4*5-6+7*8-9 = 99 1*2-3*4+5*6+7+8*9 = 99 1*2-3*4-5+6*7+8*9 = 99 -1*2*3+4*5+6+7+8*9 = 99 1*2*3+4*5-6+7+8*9 = 99 -1*2*3-4+5*6+7+8*9 = 99 -1*2*3-4-5+6*7+8*9 = 99 1*2*3*4*5/6+7+8*9 = 99 1/2/3*4*5*6+7+8*9 = 99 Комбинированные знаки без скобок применять можно?
Просмотр всех вариантов - будет банальный echo с правильными ответами, но их можно достать только перебором.
У меня получился такой код. Но почему-то он повторяет результаты. Хотя вроде счетчик изменяется каждый раз после прохождения цикла на 1, а значит результаты деления всегда различны. Кто-то поймет почему? set_time_limit(0); $znaki = array ('+','-','*','/'); $odin = array (' ','-'); $SUM = 0; $n = 0; $end = (bcpow(4, 9, 0) - 1); $sss = 0; do { $sum = $SUM; $a1 = $sum % 4; $sum = ($sum - $a1)/ 4; $a1 = $znaki[$a1]; $a2 = $sum % 4; $sum = ($sum - $a2)/ 4; $a2 = $znaki[$a2]; $a3 = $sum % 4; $sum = ($sum - $a3)/ 4; $a3 = $znaki[$a3]; $a4 = $sum % 4; $sum = ($sum - $a4)/ 4; $a4 = $znaki[$a4]; $a5 = $sum % 4; $sum = ($sum - $a5)/ 4; $a5 = $znaki[$a5]; $a6 = $sum % 4; $sum = ($sum - $a6)/ 4; $a6 = $znaki[$a6]; $a7 = $sum % 4; $sum = ($sum - $a7)/ 4; $a7 = $znaki[$a7]; $a8 = $sum % 4; $sum = ($sum - $a8)/ 4; $a8 = $znaki[$a8]; $a9 = $sum % 4; $sum = ($sum - $a9)/ 4; $a9 = $odin[$a9]; $SUM++; eval("\$otv = {$a9}1{$a8}2{$a7}3{$a6}4{$a5}5{$a4}6{$a3}7{$a2}8{$a1}9;"); if ($otv == 99) { echo "{$a9}1{$a8}2{$a7}3{$a6}4{$a5}5{$a4}6{$a3}7{$a2}8{$a1}9<br>"; $sss++; } } while ($n <= $end); echo "Итого $sss вариантов";
dk-ne Ээээ, те же лыжи, только анально. Тот же перебор, только сделанный одним циклом. А ошибка - вы не инкрементируете $n. Вот если бы вы могли найти решение аналитически - тогда бы еще можно было подискутировать
У тебя то код, как я понял, берет случайные значения из массива. А я попытался сделать по порядку, чтоб ни одно решение не пропустить. Поясни, плз, про $n. Что не так? Я еще слабо разбираюсь в пхп
dk-ne http://php.net/foreach Ну или английский учите. В условии выхода из цикла - используется $n - оно нигде не увеличивается
Спс. Добавил $n++ в цикл. И вот что получилось: 1+2+3+4*5-6+7+8*9 1+2-3+4+5*6+7*8+9 1+2-3+4+5*6-7+8*9 1*2+3+4+5+6+7+8*9 1*2+3-4*5+6*7+8*9 1*2-3*4+5*6+7+8*9 1*2-3*4-5+6*7+8*9 1*2*3+4*5-6+7+8*9 1*2*3*4*5/6+7+8*9 1/2/3*4*5*6+7+8*9 -1+2*3+4+5+6+7+8*9 -1+2*3-4*5+6*7+8*9 -1+2*3*4+5+6+7*8+9 -1+2*3*4+5+6-7+8*9 -1-2+3+4+5*6+7*8+9 -1-2+3+4+5*6-7+8*9 -1-2+3*4+5+6+7+8*9 -1-2-3+4*5+6+7+8*9 -1-2-3-4+5*6+7+8*9 -1-2-3-4-5+6*7+8*9 -1*2+3*4*5+6*7+8-9 -1*2+3*4*5-6+7*8-9 -1*2*3+4*5+6+7+8*9 -1*2*3-4+5*6+7+8*9 -1*2*3-4-5+6*7+8*9 1+2+3+4*5-6+7+8*9 1+2-3+4+5*6+7*8+9 1+2-3+4+5*6-7+8*9 1*2+3+4+5+6+7+8*9 1*2+3-4*5+6*7+8*9 1*2-3*4+5*6+7+8*9 1*2-3*4-5+6*7+8*9 1*2*3+4*5-6+7+8*9 1*2*3*4*5/6+7+8*9 1/2/3*4*5*6+7+8*9 1+2+3+4*5-6+7+8*9 1+2-3+4+5*6+7*8+9 1+2-3+4+5*6-7+8*9 1*2+3+4+5+6+7+8*9 1*2+3-4*5+6*7+8*9 1*2-3*4+5*6+7+8*9 1*2-3*4-5+6*7+8*9 1*2*3+4*5-6+7+8*9 1*2*3*4*5/6+7+8*9 1/2/3*4*5*6+7+8*9 Итого 45 вариантов И тут блин опять повторы. Как отредактировать код чтоб он нормально все считал?
dk-ne Попробую вразумить последний раз - foreach - перебирает все данные из заданного массива, к примеру: PHP: $arr = array(1,2,3,4,5,6); foreach($arr as $val) echo $val."<br>\n"; Но ладно, вы сам себе враг - поэтому посмотрите еще раз сколько итераций вам нужно. Это не 4 в 9 степени, а 4 в 8 степени умноженное на 2, потому что первый знак может принимать 2 значения