题解 | #求1+2+3+...+n#

求1+2+3+...+n

http://www.nowcoder.com/practice/7a0da8fc483247ff8800059e12d7caf1

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遍(还是不建议的),哈哈。

全部评论

相关推荐

02-22 18:38
门头沟学院 Java
程序员牛肉:标准的NPC简历,一个短链接+12306。你可以在牛客上面搜一搜有多少人的简历和你一样。你自己能不能给出你一个理由让面试官在大家简历高度相同的情况下,选择约面你而不是对应的211,985学生? 是因为你即将拥有的那段小厂实习吗?这种小厂实习真的很有含金量吗?因此你可以找实习,但是你如果只能找到小厂实习的话,其实意义不太大。 但你的时间是充足的,相信我:从现在到今年的九月份大三上你就干两个事情:"写博客"+“参加开源之夏”。这两个搞好了不亚于一段大厂实习的含金量。 想要让自己变得更强,首先就是不要把自己当打工人看待,让自己简历上面的活人气息更多一点,不要让自己成为流水线的产物。你不是在出售你的技能,你是在利用你的技能和公司达成一种合作关系。
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务