2012-03-14 8 views
6

これはインタビューの質問です。 私たちは2つの構築ループとインクリメントのみを使用して減算を実装する方法

  1. loop(a)回のループを意味しています。
  2. increment(a)増分a。従って、+ 1が、質問が-Bを実装する方法である

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

    を書くことができbの実装する

+0

いいえ。面接の質問にタグを付けました。 – Neal

+0

私はそれが不可能だと思います。否定または減分の関数が必要です –

+0

おそらくいくつかの比較関数も利用できますか?あなたの唯一の構成要素が本当にループとインクリメントであるなら、私は不可能だと思っていますが、分岐することでそれを機能させることができます。 –

答えて

9

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;

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

a = 2の場合、0を出力します。ネゲート関数が必要です。 –

+0

はい、それは床の負の数値になりますが、それはあなたが得ることができるように近い私は否定が許可されていると考えて –

0

私たちはxを探していますので、a-b = xとなります。換言= B + X

擬似コード

INT X = 0

WHILE(X < = A)を実行{

IF(B + X == A)BREAK //満足AB = X

X ++

}

1

依存この数字アーキテクチャが知られている場合:

署名番号付けスキームのような環状である場合には、例えば、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) } 
} 

としてriddelを解決

希望はこれが良いです:) 最高の運。

3

私はループからブレークが許可されている場合、-bがこの方法で行うことができると思う:

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

> Bを想定してofcourseの。

+1

しかし、再び、あなたはループ()とinc()を使用することができます。 ==演算子は使用できません。 –

-1
RESET B 
INC B 
LOOP A 
{ 
    INC D 
    LOOP B 
    { 
     RESET D 
    } 
} 
関連する問題