Как реализовать вычитание, используя только цикл и приращение - PullRequest
7 голосов
/ 14 марта 2012

Это вопрос интервью.У нас есть только две конструкции

  1. loop(a) означает цикл для времени.
  2. increment(a) увеличивает a.

Таким образом, чтобы реализовать a + bможно написать

loop(a) {inc(b)} 
return b;

Вопрос в том, как реализовать аб.

Ответы [ 5 ]

11 голосов
/ 14 марта 2012

Как насчет;

a = 10
b = 8
result = 0

loop(b) {
   last = 0
   times = 0;
   loop(a) {
      last = times
      times = inc(times)
   }
   result = a = last
}

result is 2

Js напр .;

3 голосов
/ 14 марта 2012

Я думаю, что если разрыв из цикла разрешен, ab можно сделать следующим образом:

c=0;
loop(a) {
    if (a==b) break;
    inc(c);
    inc(b);
}
return c;

Конечно, предполагая a> b.

1 голос
/ 14 марта 2012

зависит, если известна эта числовая архитектура:

вы можете воспользоваться механизмом «Два комплимента» архитектуры x86 / x64,

например, если подписанная схема нумерации имеет циклический характер.

f(0 < x < 32768)     = x
f(32769 < x < 65535) = x - 65536

Тогда вы можете использовать:

dec(a)
{
    loop(65535 [= 2^16-1]) { inc(a) }
}

.

решение Ридделя как

(a-b)
{
   loop(b) { dec(a) }
}

В зависимости от схемы со знаком константа сложения может изменяться, то же самое для коротких, длинных и больших целых типов.

Надеюсь, это хорошо :) Желаем удачи.

0 голосов
/ 26 сентября 2013
RESET B
INC B
LOOP A
{
    INC D
    LOOP B
    {
        RESET D
    }
}
0 голосов
/ 14 марта 2012

Мы ищем x, так что ab = x.Другими словами a = b + x

псевдокод

int x = 0

WHILE (x <= a) do {</p>

if (b +x == a) BREAK // удовлетворяет ab = x

x ++

}

...