我被问到这个面试问题:
将数字乘以7的最快方法是什么?
她告诉我不要使用任何+ , - , * , /
运营商。
在紧张时,我无法回答这个问题。
我知道将数字乘以8的最快方法是n<<3
但可以n*7
实现吗?
答案 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中所以不得不切换到+ =。仍然不同于+技术但有点可疑。
我知道它使用的是++,但肯定与“+”不相同而且。=避免了规定。