Задачка для 3 класса школы

Discussion in 'PHP' started by dk-ne, 27 Dec 2009.

  1. dk-ne

    dk-ne Elder - Старейшина

    Joined:
    21 Jan 2007
    Messages:
    73
    Likes Received:
    2
    Reputations:
    0
    Вобщем дочке моей знакомой в итоговой контрольной на дом задали задачку по математике. Смысл такой:
    1 2 3 4 5 6 7 8 9 = 99
    Между цифрами нужно расставить знаки ( + - * / ), причем нельзя пользоваться скобками, и чтобы в итоге получился правильный ответ. Один из ответов:
    1*2+3+4+5+6+7+8*9. Таких ответов несколько. Так вот, дам плюсики тому, кто составит самый простой php код, выводящий все возможные варианты решения этой задачи.
     
    #1 dk-ne, 27 Dec 2009
    Last edited: 27 Dec 2009
  2. astrologer

    astrologer Elder - Старейшина

    Joined:
    30 Aug 2007
    Messages:
    837
    Likes Received:
    267
    Reputations:
    59
    Дети в 3 классе уже знакомы с дробями и отрицательными числами или нет ещё?
     
  3. PaTRom

    PaTRom Banned

    Joined:
    10 Jul 2008
    Messages:
    5
    Likes Received:
    3
    Reputations:
    -5
    а сколько плюсиков дашь?
     
  4. Gifts

    Gifts Green member

    Joined:
    25 Apr 2008
    Messages:
    2,494
    Likes Received:
    807
    Reputations:
    614
    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 == 99printf("%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
    Комбинированные знаки без скобок применять можно?
     
    _________________________
    #4 Gifts, 27 Dec 2009
    Last edited: 27 Dec 2009
    2 people like this.
  5. dk-ne

    dk-ne Elder - Старейшина

    Joined:
    21 Jan 2007
    Messages:
    73
    Likes Received:
    2
    Reputations:
    0
    В целом, задача решена. Спс. Но все-таки здесь перебор, а не просмотр всех вариантов. 3++ добавил
     
  6. mailbrush

    mailbrush Well-Known Member

    Joined:
    24 Jun 2008
    Messages:
    1,997
    Likes Received:
    996
    Reputations:
    155
    Просмотр всех вариантов - будет банальный echo с правильными ответами, но их можно достать только перебором.
     
  7. dk-ne

    dk-ne Elder - Старейшина

    Joined:
    21 Jan 2007
    Messages:
    73
    Likes Received:
    2
    Reputations:
    0
    У меня получился такой код. Но почему-то он повторяет результаты. Хотя вроде счетчик изменяется каждый раз после прохождения цикла на 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 вариантов";
     
  8. Gifts

    Gifts Green member

    Joined:
    25 Apr 2008
    Messages:
    2,494
    Likes Received:
    807
    Reputations:
    614
    dk-ne Ээээ, те же лыжи, только анально. Тот же перебор, только сделанный одним циклом. А ошибка - вы не инкрементируете $n. Вот если бы вы могли найти решение аналитически - тогда бы еще можно было подискутировать
     
    _________________________
  9. dk-ne

    dk-ne Elder - Старейшина

    Joined:
    21 Jan 2007
    Messages:
    73
    Likes Received:
    2
    Reputations:
    0
    У тебя то код, как я понял, берет случайные значения из массива. А я попытался сделать по порядку, чтоб ни одно решение не пропустить. Поясни, плз, про $n. Что не так? Я еще слабо разбираюсь в пхп
     
  10. Gifts

    Gifts Green member

    Joined:
    25 Apr 2008
    Messages:
    2,494
    Likes Received:
    807
    Reputations:
    614
    dk-ne http://php.net/foreach Ну или английский учите.

    В условии выхода из цикла - используется $n - оно нигде не увеличивается
     
    _________________________
  11. dk-ne

    dk-ne Elder - Старейшина

    Joined:
    21 Jan 2007
    Messages:
    73
    Likes Received:
    2
    Reputations:
    0

    Спс. Добавил $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 вариантов

    И тут блин опять повторы. Как отредактировать код чтоб он нормально все считал?
     
  12. Gifts

    Gifts Green member

    Joined:
    25 Apr 2008
    Messages:
    2,494
    Likes Received:
    807
    Reputations:
    614
    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 значения
     
    _________________________
  13. krypt3r

    krypt3r Elder - Старейшина

    Joined:
    27 Apr 2007
    Messages:
    1,507
    Likes Received:
    389
    Reputations:
    101
    Часть ответа не проканает, ибо дети в третьем классе не знают про отрицательные числа и дроби