我最近对一份工作申请进行了C#技术评估,其中一个问题是:
问题11:实现函数
int Mult27(int a)
,使其返回a
乘以27的结果。仅使用以下函数(提供)这样做:
SHL(a,b)
将整数a
的所有位左移b
个位置。ADD(a,b)
将两个整数相加得到a+b
。SUB(a, b)
减去两个整数得到a-b
。假设
a
始终是正整数,请尽可能少地调用这些函数。public class AnswerEleven { int SHL(int a, int b) { return a << b; } int ADD(int a, int b) { return a + b; } int SUB(int a, int b) { return a - b; } public int Mult27(int a) { } }
我很确定我不允许使用%
之类的运算符,并且我也不能使用字符串转换或其他类型。除了左移左移以获得2的幂(只能由2的幂解决)或使用二除法和减法(这无济于事)外,我没有其他办法。但是似乎有多种方法可以解决问题。
我最终无法解决问题就提交了,这困扰着我,如果不使用典型但不允许的方法就找不到答案。有什么想法吗?
答案 0 :(得分:3)
可以用多种方法将整数解构为2的幂。这是一个简单的例子:
27x = 32x-5x = 32x-4x-x
因此您可以写
public int Mult27(int a)
{
return SUB(SUB(SHL(a, 5), SHL(a, 2)), a);
}
这仅使用四个调用您允许的功能。我相信很难顶。
答案 1 :(得分:2)
如何?
public int Mult27(int a)
{
return ADD(ADD(SHL(a, 4), SHL(a, 3)), SUB(SHL(a, 2), a));
}
var ae = new AnswerEleven();
Console.WriteLine(ae.Mult27(1));
Console.WriteLine(ae.Mult27(2));
得到27
和54
。
答案 2 :(得分:0)
public int Mult27(int a)
{
a = ADD(a, SHL(a, 1)); // or SUB(SHL(a, 2), a) → a = 3a
return ADD(a, SHL(a, 3)); // 3a + 8*3a = 27a
}
它具有很好的属性,它在移动5时避免溢出,就像展开27x = 32x-5x时一样
这是一个备用版本,也使用4个呼叫
int a4 = SHL(a, 2); // a4 = a*4
return SUB(SUB(SHL(a4, 3), a4), a); // a4*8 - a4 - a