2012-03-14 14 views
6

Questa è una domanda di intervista. Abbiamo solo due costruttiCome implementare la sottrazione usando solo loop e incremento

  1. loop(a) mezzi ad anello per volte.
  2. increment(a) incrementi a.

Così, per implementare un + b si potrebbe scrivere

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

La domanda è: come implementare un-b.

+0

No. Ho taggato domande-intervista. – Neal

+0

Penso che sia impossibile; hai bisogno di una funzione di negazione o di decremento –

+0

Presumibilmente hai a disposizione alcune funzioni di confronto, sì? Se i tuoi unici costrutti sono davvero loop e incremento, penso che sia impossibile, ma con la ramificazione potresti farlo funzionare. –

risposta

9

Come circa;

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 eg;

var a = 10; 
var b = 8; 
var result; 

for (var _b = 0; _b < b; _b++) { 
    var last = 0, times = 0, loopa = 0; 
    for (var _a = 0; _a < a; _a++) { 
     last = times; 
     times = inc(times); 
    } 
    result = a = last; 
} 

function inc(i) { 
    return i + 1; 
} 

print(result) // 2 
+0

se a = 2 stampa 0. È necessaria una funzione di negazione. –

+0

Sì, perderà i numeri negativi, ma è il più vicino possibile, credo, dato che non è consentita la negazione –

0

Siamo alla ricerca di x, quindi a-b = x. In altre parole, a = b + x

Pseudocodice

int x = 0

WHILE (x = < a) do {

if (b + x == a) PAUSA // soddisfa ab = x

x ++

}

1

dipende se questa architettura numerico è noto:

è possibile usufruire del meccanismo di "Due Complimento" delle architetture x86/x64,

per esempio, se lo schema di numerazione firmato è ciclico come.

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

quindi è possibile utilizzare:

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

.

risolvere il Riddel come

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

A seconda dello schema Firmato l'aggiunta costante può cambiare, lo stesso per brevi, lunghi, grandi tipi interi.

Spero che questo sia buono :) Buona fortuna.

3

penso che se è consentito pausa dal circuito, a-b può essere fatto in questo modo:

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

Naturalmente assumendo una> b.

+1

ma, di nuovo, è possibile utilizzare solo loop() e inc(). Non puoi usare l'operatore ==. –

-1
RESET B 
INC B 
LOOP A 
{ 
    INC D 
    LOOP B 
    { 
     RESET D 
    } 
} 
Problemi correlati