Найти результат функции - PullRequest
1 голос
/ 16 мая 2011

Есть код неизвестной функции:

function Magic(number)
    r = number mod 2
    print r
    if number > 1
        Magic(number / 2)

(записано в псевдокоде)

Вопрос в том, какое целое число нужно передать, чтобы получить следующий ответ

0 1 1 0 0 1

Основная проблема в том, что я не могу понять, как работает мод в псевдокоде. Стоит 5,5 мод 3 = 2,5 или 2

Ответы [ 3 ]

1 голос
/ 16 мая 2011

Операции деления и мода должны принимать только и выводить целые числа здесь. "5.5 мод 3", например не имеет никакого смысла. И 11/2 (целочисленное деление) вернет 5, а не 5,5.

Вот программа PHP, которая реализует ваш псевдокод:

<?php

function Magic($number) {
    $r = $number % 2;
    echo $r . ' ';

    if ($number > 1) Magic($number / 2);
}

for ($i = 16; $i < 34; ++$i) {
    echo "($i: ";

    Magic($i);
    echo ") ";
}

echo "\n";

Результаты на выходе:

(16: 0 0 0 0 1 ) (17: 1 0 0 0 1 0 ) (18: 0 1 0 0 1 0 ) (19: 1 1 0 0 1 0 ) (20: 0 0 1 0 1 0 ) (21: 1 0 1 0 1 0 ) (22: 0 1 1 0 1 0 ) (23: 1 1 1 0 1 0 ) (24: 0 0 0 1 1 0 ) (25: 1 0 0 1 1 0 ) (26: 0 1 0 1 1 0 ) (27: 1 1 0 1 1 0 ) (28: 0 0 1 1 1 0 ) (29: 1 0 1 1 1 0 ) (30: 0 1 1 1 1 0 ) (31: 1 1 1 1 1 0 ) (32: 0 0 0 0 0 1 ) (33: 1 0 0 0 0 1 0 )

Что показывает, что 6-значный результат (x: 0 1 1 0 0 1 ) невозможен для любого целого числа x (из-за монотонного роста выходной строки). Тем не менее, Magic (38) равен 0 1 1 0 0 1 0 - первый 7-значный результат с требуемой строкой, но также с завершающим нулем.

Что касается отрицательных целочисленных значений, возможны только 2 выхода: «0» и «-1».

0 голосов
/ 16 мая 2011

Прежде всего, вот исполняемый код Python для этой проблемы.

def Magic(number):
r = number % 2
print r
if number > 1:
    Magic(number / 2)

Magic(15)       

Однако в этой задаче характерно то, что функция возвращает двоичное число REVERSE для данного входного номера.Таким образом, в этом случае самым простым решением было бы взять 0 1 1 0 0 1, обратить его к 100110 и вычислить значение этого двоичного числа, которое равно 32 + 4 + 2 = 38. Используя эту методологию, вы можетевычислить требуемое число или ожидаемый результат для любого заданного входа.

0 голосов
/ 16 мая 2011

mod дает вам остаток от целочисленного деления.Несколько примеров:

  • 1 mod 2 = 1 (так как 1/2 = 0 в целочисленном делении)
  • 2 mod 2 = 0 (2/2 = 1, без остатка)
  • 6 mod 3 = 0 (6/3 = 2, без остатка)
  • 8 mod 3 = 2

Дробная часть, вероятно, должна быть пропущена.в большинстве языков это зависит от типа данных числа (некоторые языки делят целочисленное деление, если оба операнда являются целыми числами, и это, вероятно, то, что вы тоже должны делать, поэтому 5/2 = 2).Что касается вашего первого вопроса ( spoiler alert! , попробуйте сами, прежде чем читать это!), Начните с конца и умножьте на два на каждом шаге.Также добавьте 1, если число должно быть 1 на этом шаге.

Итак, последний шаг - 1. Начните с 1:

  • 1
  • 1 * 2 = 2
  • 2 * 2 = 4
  • 4 * 2 + 1 = 9

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

...