也谈1+2+3+...+n的解答

据说某个公司有道笔试题是这样的:

求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


 

则其计算过程就是一个乘数的每位与另一个乘数分别相乘,然后移位相加。所以n*n也可以转换成类似的方式来处理。假设n为32位整数,n*n也为32位整数,则n*n就是两个32位二进制数相乘。其实就是32个数相加,由上面的公式也可以看出来。
二进制乘法反而更简单,就如上图所示的一样,每位要么是0,要么是1,如果是0,则不用相加了,如果是1,则结果就需要加。具体做法就是n的每一位都跟n相乘,当然是要向前移一位,然后相加。
具体c++代码实现为:
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的时候,就不需要相加了。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Simple-Soft

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值