2012-03-14 39 views
6

這是一個面試問題。 我們只有兩個構造如何只使用循環實現減法和增加

  1. loop(a)意味着循環一次。
  2. increment(a)遞增。

因此實現A + B一個可以寫

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

的問題是如何實現A-B。

+0

都能跟得上。我已經標記了面試問題。 – Neal 2012-03-14 11:26:18

+0

我認爲這是不可能的;你需要一個否定或減量函數 – 2012-03-14 12:20:45

+0

大概你有一些比較函數可用,是嗎?如果你的唯一構造確實是循環和增量,我認爲這是不可能的,但是通過分支你可以使它工作。 – 2012-03-14 12:57:09

回答

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

如果a = 2,則打印0.您需要一個否定功能。 – 2012-03-14 12:45:37

+0

贊成它會發言負數,但其儘可能接近你可以得到我認爲有沒有否定允許 – 2012-03-14 12:52:57

0

我們是尋找X,使A-B = X。換言之A = B + X

INT x = 0的

WHILE(X < =一)做{

如果(B + X == a)破//滿足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) } 
} 

解決riddel作爲

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

根據簽名方案的相加常數可以改變,同爲短,長,大的整數類型。

希望這是個好:) 好運。

3

我認爲,如果從迴路斷線是允許的,A-B可以以這種方式來完成:

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

Ofcourse假設A> B。

+1

但是,再次,你只能使用loop()和inc()。你不能使用==運算符。 – 2012-03-14 14:18:12

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