2012-03-14 8 views
6

Esta es una pregunta de la entrevista. Tenemos sólo dos construccionesCómo implementar la resta utilizando solo el ciclo y el incremento

  1. loop(a) significa bucle por unos momentos.
  2. increment(a) incrementa a.

Así, para poner en práctica a + b se podría escribir

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

La cuestión es cómo implementar un-b.

+0

Nope. He etiquetado preguntas de entrevista. – Neal

+0

Creo que es imposible; necesita una función de negación o decremento –

+0

Es de suponer que tiene algunas funciones de comparación disponibles también, ¿sí? Si sus únicas construcciones son realmente bucle e incremento, creo que es imposible, pero con la bifurcación podría hacer que funcione. –

Respuesta

9

¿Qué tal;

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

si a = 2 imprime 0. Necesita una función de negación. –

+0

Sí, dejará de lado los números negativos, pero está lo más cerca posible, creo que, dado que no se permite la negación, –

0

Estamos buscando x, de modo que a-b = x. En otras palabras a = b + x

Pseudocódigo

int x = 0

WHILE (x < = a) hacer {

si (b + x == a) ROTURA // satisface ab = x

x ++

}

1

depende si esta arquitectura numérico es conocido:

puede tomar ventaja del mecanismo de "Dos Piropo" de la arquitectura x86/x64,

por ejemplo, si el esquema de numeración firmado es cíclico similares.

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

continuación, puede utilizar:

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

.

resolver el riddel como

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

Dependiendo del esquema firmado la constante adición se puede cambiar, lo mismo para, grandes tipos de enteros cortos y largos.

Espero que esto sea bueno :) Lo mejor de la suerte.

3

creo que si se permite descanso de bucle, a-b se puede hacer de esta manera:

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

Por supuesto suponiendo que a> b.

+1

pero, de nuevo, solo se puede usar loop() y aum(). No puedes usar == operador. –

-1
RESET B 
INC B 
LOOP A 
{ 
    INC D 
    LOOP B 
    { 
     RESET D 
    } 
} 
Cuestiones relacionadas