计算1+2+ ... +n 的值

参考:https://leetcode-cn.com/problems/qiu-12n-lcof/solution/qiu-12n-by-leetcode-solution/
1+2+...+n ,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。

示例 1:

输入: n = 3
输出: 6

示例 2:

输入: n = 9
输出: 45

限制:

  • 1 <= n <= 10000

解题思路1:使用逻辑运算表达式模拟判断条件,然后进行递归运算

class Solution {
    public int sumNums(int n) {
        // 当n=0时,开始逐层返回n的值
        boolean  flag = n > 0 && (n += sumNums(n -  1)) > 0;
        return n;
    }
}

解题思路2: 计算 1+2+...+n 的求和公式为n * ( n + 1) / 2,因此可以使用下列的俄罗斯乘法模拟两数相乘,的到的最终值进行右移运算即可。

/**
 * 俄罗斯乘法:计算35 * 72
 * 35 72
 * 17 144      35 >> 1      72  << 1
 * 8 288       17 >> 1      144 << 1
 * 4 576       8  >> 1      288 << 1
 * 2 1152      ...
 * 1 2304
 *
 * 从上到下,对每一行,若左边的数字若为奇数,则将右边的数字取出,累加。
 * 72+144+2304=2520
 * 累加的结果2520即为乘积。
 */
public static int quickMulti(int a, int b) {
    int ans = 0;
    for (; b > 0; b >>= 1) {
        // 如果b为奇数,则累加a
        if ((b & 1) > 0) {
            ans += a;
        }
        a <<= 1;
    }
    return ans;
}


class Solution {
    public int sumNums(int n) {
        int ans = 0, A = n, B = n + 1;
        boolean flag;

        // 如果B为奇数,则对 A 进行累加
        flag = ((B & 1) > 0) && (ans += A) > 0;
        A <<= 1;
        B >>= 1;

        flag = ((B & 1) > 0) && (ans += A) > 0;
        A <<= 1;
        B >>= 1;

        flag = ((B & 1) > 0) && (ans += A) > 0;
        A <<= 1;
        B >>= 1;

        flag = ((B & 1) > 0) && (ans += A) > 0;
        A <<= 1;
        B >>= 1;

        flag = ((B & 1) > 0) && (ans += A) > 0;
        A <<= 1;
        B >>= 1;

        flag = ((B & 1) > 0) && (ans += A) > 0;
        A <<= 1;
        B >>= 1;

        flag = ((B & 1) > 0) && (ans += A) > 0;
        A <<= 1;
        B >>= 1;

        flag = ((B & 1) > 0) && (ans += A) > 0;
        A <<= 1;
        B >>= 1;

        flag = ((B & 1) > 0) && (ans += A) > 0;
        A <<= 1;
        B >>= 1;

        flag = ((B & 1) > 0) && (ans += A) > 0;
        A <<= 1;
        B >>= 1;

        flag = ((B & 1) > 0) && (ans += A) > 0;
        A <<= 1;
        B >>= 1;

        flag = ((B & 1) > 0) && (ans += A) > 0;
        A <<= 1;
        B >>= 1;

        flag = ((B & 1) > 0) && (ans += A) > 0;
        A <<= 1;
        B >>= 1;

        flag = ((B & 1) > 0) && (ans += A) > 0;
        A <<= 1;
        B >>= 1;

        return ans >> 1;
    }
}
原文地址:https://www.cnblogs.com/code-duck/p/13772904.html