这是一个面试问题。 我们只有两个结构
loop(a)
表示循环一次。increment(a)
增加a。因此,为了实现一个+ b,可以编写
loop(a) {inc(b)}
return b;
问题是如何实施a-b。
答案 0 :(得分:11)
怎么样;
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
答案 1 :(得分:3)
我认为如果允许从循环中断,可以用这种方式完成a-b:
c=0;
loop(a) {
if (a==b) break;
inc(c);
inc(b);
}
return c;
当然假设a> b。
答案 2 :(得分:1)
取决于此数字架构是否已知:
您可以利用x86 / x64架构的“双重赞美”机制,
例如,如果签名编号方案是循环的,如。
f(0 < x < 32768) = x
f(32769 < x < 65535) = x - 65536
然后你可以使用:
dec(a)
{
loop(65535 [= 2^16-1]) { inc(a) }
}
解决了riddel as
(a-b)
{
loop(b) { dec(a) }
}
根据Signed方案,加法常量可以改变,对于短,长,大整数类型也是如此。
希望这很好:) 祝你好运。
答案 3 :(得分:0)
我们正在寻找x,所以a-b = x。换句话说,a = b + x
伪代码
int x = 0
WHILE(x <= a)做{
if(b + x == a)BREAK //满足a-b = x
X ++
}
答案 4 :(得分:-1)
RESET B
INC B
LOOP A
{
INC D
LOOP B
{
RESET D
}
}