乘以七

时间:2011-05-25 14:35:21

标签: c

我被问到这个面试问题: 将数字乘以7的最快方法是什么? 她告诉我不要使用任何+ , - , * , /运营商。 在紧张时,我无法回答这个问题。

我知道将数字乘以8的最快方法是n<<3 但可以n*7实现吗?

11 个答案:

答案 0 :(得分:12)

假设您的编译器不是很糟糕,n*7

答案 1 :(得分:10)

满足您的几乎所有要求:)

#include <stdio.h>

int mult7(int i)
{
    int res;
    __asm__("imull  $7, %1, %0" : "=r" (res) : "r" (i));
    return res;
}

int main()
{
    printf("%d", mult7(12)); //output: 84
    return 0;
}

答案 2 :(得分:7)

没有禁止使用的操作符(+-*/):)

/* multiply by 7 without using the forbidden operators */
/* if `n` is larger than `INT_MAX / 7`
** or smaller than `INT_MIN / 7`
** the behaviour is undefined. */
int mult7(int n) {
  int n7 = n;
  n7 *= 7;
  return n7;
}

答案 3 :(得分:5)

n*7 == (n<<3) - n

不确定这是否会比正常乘法更好7但

答案 4 :(得分:5)

正确答案是

的组合
a) n*7

因为这正是编译器完全能够自行解决的那种微优化。

b) the interviewer has a poor understanding of modern optimizing compilers

或者,如果面试官不是一无所知,那么上述答案不同于a)表明受访者不理解优化编译器,因此是该工作的不良候选人。 : - /

答案 5 :(得分:5)

我能想出的最佳答案是使用while循环和每位的按位运算符编写“+”运算。像这样:


int add(int x, int y) {
  int a, b;
  do {
    a = x & y; b = x ^ y; x = a << 1; y = b;
  }while(a);
  return b;
}

然后总结n,n&lt;&lt; 1,n&lt;&lt; 2。

“+”很容易用while循环写入,如果你能想出用while循环编写“ - ”的方式(我不知道该怎么做),你可以做(​​n&lt;&lt; 3) - n。

出处:http://geeki.wordpress.com/2007/12/12/adding-two-numbers-with-bitwise-and-shift-operators/

答案 6 :(得分:2)

可能是

n*7

(n<<3) - n

答案 7 :(得分:2)

也许这也是一个有效的答案:pow(10, log10(n) + log10(7))

答案 8 :(得分:1)

噢,你太近了!

=(n <&lt; 3-n)

= n * 8 - n

= n(8 - 1)

= n * 7

答案 9 :(得分:1)

假设面试官正在寻找一个移位和添加的答案,我想你可以使用:

int ans = (num<<2) + (num<<1) + num;

如果受访者知道这个特殊的算法,我想这是一种粗暴的测试方法。

答案 10 :(得分:0)

int main()
   {
        int i;
        int x;
        int n;
        x = n;
        for (i = 2; i < 8; i++)
        {
             n += x;
        }
        return 0;
    }

编辑:转换为c(我认为),并意识到没有。=在c中所以不得不切换到+ =。仍然不同于+技术但有点可疑。

我知道它使用的是++,但肯定与“+”不相同而且。=避免了规定。