标签:编程
据说某个公司有道笔试题是这样的:
求1+2+3+...+n,编程实现,但是不允许用if,while,for,?等语句,也不能用乘除法。当然肯定也不允许用pow这样的函数了。
我们都知道,1+2+3+...+n=n*(n+1)/2=(n*n+n)/2,一个数除以2,等于右移1位。比如4(二进制为100),右移1位则为2(二进制为10)。由于不能用乘除法,所以需要将n*n转换为加减法了。
回忆一下乘法的竖式计算方法,假设101×101,如下图所示:
1 0 1
1 0 1
———
1 0 1
0 0 0
1 0 1
------------------
1 0 2 0 1
int sum(int n) { int result = n; ((n>>1) & 1) && (result += (n<<1)); ((n>>2) & 1) && (result += (n<<2)); ... ((n>>31) & 1) && (result += (n<<31)); return result >> 1; }需要说明的是&&符号,这里用到了编译器的优化功能,如果&&前面的表达式为false,则右边的表达式就不会执行。所以当某位为0的时候,就不需要相加了。
标签:编程
原文地址:http://blog.csdn.net/zhanghaiyang9999/article/details/41362065