求1+2+…+n
题目链接
求 1+2+…+n ,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。
示例 1:
输入: n = 3
输出: 6
示例 2:
输入: n = 9
输出: 45
限制:
1 <= n <= 10000
解题思路
思路1
- 递归求和,巧妙地避免了乘除,循环等操作
- 时间复杂度 O ( n ) O(n) O(n),空间复杂度 O ( n ) O(n) O(n)
思路2
- 快速乘
- 求和公式为n*(n+1)
- n二进制展开最多不会超过14 位,手动执行多次快速乘代替循环即可
- 时间复杂度 O ( l o g n ) O(logn) O(logn),空间复杂度 O ( 1 ) O(1) O(1)
解题代码
代码1
class Solution {
public:
int sumNums(int n) {
if(n<=1)return n;
return sumNums(n-1)+n;
}
};
代码2
class Solution {
public:
int sumNums(int n) {
int ans=0;
int x=n+1;
if(n&1)ans+=x;
x+=x;
n>>=1;
if(n&1)ans+=x;
x+=x;
n>>=1;
if(n&1)ans+=x;
x+=x;
n>>=1;
if(n&1)ans+=x;
x+=x;
n>>=1;
if(n&1)ans+=x;
x+=x;
n>>=1;
if(n&1)ans+=x;
x+=x;
n>>=1;
if(n&1)ans+=x;
x+=x;
n>>=1;
if(n&1)ans+=x;
x+=x;
n>>=1;
if(n&1)ans+=x;
x+=x;
n>>=1;
if(n&1)ans+=x;
x+=x;
n>>=1;
if(n&1)ans+=x;
x+=x;
n>>=1;
if(n&1)ans+=x;
x+=x;
n>>=1;
if(n&1)ans+=x;
x+=x;
n>>=1;
if(n&1)ans+=x;
x+=x;
n>>=1;
return ans>>1;
}
};