参考: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;
}
}