2012-03-14 20 views
6

Đây là câu hỏi phỏng vấn. Chúng tôi chỉ có hai cấu trúcCách thực hiện phép trừ chỉ sử dụng vòng lặp và số tăng

  1. loop(a) có nghĩa là lặp lại một lần.
  2. increment(a) gia số a.

Vì vậy, để thực hiện a + b ta có thể viết

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

Câu hỏi đặt ra là làm thế nào để thực hiện một-b.

+0

Không. Tôi đã gắn thẻ câu hỏi phỏng vấn. – Neal

+0

Tôi nghĩ điều đó là không thể; bạn cần một chức năng phủ định hoặc giảm dần –

+0

Có lẽ bạn có một số chức năng so sánh có sẵn, vâng? Nếu cấu trúc duy nhất của bạn thực sự là vòng lặp và tăng tôi nghĩ rằng nó là không thể, nhưng với phân nhánh bạn có thể làm cho nó hoạt động. –

Trả lời

9

Làm thế nào về;

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 ví dụ;

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

nếu a = 2 nó in 0. Bạn cần một chức năng phủ định. –

+0

Aye nó sẽ sàn số âm, nhưng nó gần như bạn có thể nhận được tôi nghĩ rằng không có phủ định cho phép –

0

Chúng tôi đang tìm kiếm x, sao cho a-b = x. Nói cách khác a = b + x

Mã giả

int x = 0

WHILE (x < = a) làm {

if (b + x == a) BREAK // thỏa mãn ab = x

x ++

}

1

phụ thuộc nếu kiến ​​trúc Numeric này được biết:

bạn có thể tận dụng lợi thế của cơ chế "Hai khen" của kiến ​​trúc x86/x64,

ví dụ, nếu kế hoạch đánh số ký là cyclic như thế nào.

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

Sau đó, bạn có thể sử dụng:

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

.

giải quyết các màn như

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

Tùy thuộc vào chương trình Ký hợp liên tục Ngoài ra có thể thay đổi, tương tự cho,, các loại số nguyên lớn dài ngắn.

Hy vọng điều này là tốt :) Chúc bạn may mắn.

3

Tôi nghĩ rằng nếu break từ vòng lặp được cho phép, một-b có thể được thực hiện theo cách này:

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

Ofcourse giả sử a> b.

+1

nhưng, một lần nữa, bạn chỉ có thể sử dụng vòng lặp() và inc(). Bạn không thể sử dụng toán tử ==. –

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