剑指offer(C++)-JZ64:求1+2+3+...+n(算法-位运算)

作者:翟天保Steven
版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处

题目描述:

求1+2+3+...+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。

数据范围: 0<n≤200
进阶: 空间复杂度 O(1) ,时间复杂度O(n)

示例:

输入:

5

返回值:

15

解题思路:

本题考察位运算。两种解题思路。题目虽然是简单的求和,但因为加了许多限制条件,所以有点意思。

1)位运算递归

扫描二维码关注公众号,回复: 16347699 查看本文章

       利用递归,完成1到n的求和,结合与运算特性,当n为0时,&&右侧不执行,变相对递归进行了终止。

2)求和公式

       Sn=(n+1)*n/2,变形为(n*n+n)>>1,n*n用pow函数实现,规避了乘法限制,除以2用右移实现,规避了除法限制。

测试代码:

1)位运算递归

class Solution {
public:
    int Sum_Solution(int n) {
        // 与运算判断n是否为正数,若n为0,则与运算后续不执行
        n && (n += Sum_Solution(n - 1));
        return n;
    }
};

2)求和公式

class Solution {
public:
    int Sum_Solution(int n) {
        // Sn=(n*n+n)/2
        int result = (int(pow(n, 2)) + n) >> 1;
        return result;
    }
};

猜你喜欢

转载自blog.csdn.net/zhaitianbao/article/details/132423133