JZ47 求1+2+3+...+n
题意分析:
求连加到n的和。
示例输入:5
返回:1+2+3+4+5=15
题解一(高斯公式):
。
int Sum_Solution(int n) {// return n * (n + 1) / 2; }
值得注意的是,该解法不满足题意要求
题解二(循环):
循环叠加即可。
intSum_Solution(int n) { int ret = 0; for (int i = 1; i <= n; i++) ret += i; return ret; }
这种解法也不满足题意。
题解三(修改循环)
上面循环,我们可以用递归代替,写成如下形式。
int Sum_Solution(int n){ if(n = 0){ return n; } else{ return n+Sum_Solution(n-1); } }
但是这里有条件控制,无妨,我们使用位运算代替即可。
int Sum_Solution(int n) { n && (n += Sum_Solution(n - 1)); return n; }
题解四(修改高斯公式):
高斯公式,/2我们可以使用>>1表示。至于我们似乎无法使用位运算表示。
但是可以使用奇怪的方法:比如可以写成 。8和1都可以用二进制表示。我们可以将其中一个数以二进制展开,然后取位运算。我们可以写成这样代码。
int Sum_Solution(int n) { int ret = 0; int a = n; int b = n + 1; while (a > 0) { (a & 1) && (ret += b); a = a >> 1; b = b << 1; } ret = ret >> 1; return ret; }
里面的while循环,我们可以手动去掉,因为最多只循环32次。我们将循环体部分手写32遍(还是不建议的),哈哈。