仅使用移位,加法和减法最少的次数乘以27

时间:2018-07-22 11:14:53

标签: c# bit-manipulation bit-shift multiplication

我最近对一份工作申请进行了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的幂解决)或使用二除法和减法(这无济于事)外,我没有其他办法。但是似乎有多种方法可以解决问题。

我最终无法解决问题就提交了,这困扰着我,如果不使用典型但不允许的方法就找不到答案。有什么想法吗?

3 个答案:

答案 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));

得到2754

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