-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathSum_Solution.cpp
More file actions
43 lines (43 loc) · 1.17 KB
/
Sum_Solution.cpp
File metadata and controls
43 lines (43 loc) · 1.17 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
/*
* 题:求1+2+...+n,要求不能使用乘除法、for、while、if、else、switch、case等
* 关键字及条件判断语句(A?B:C)
*
* 一提交发现自己读题不慎,不能用while,所以我的方法不合题意(大雾
*/
class solution{
public:
int Sum_Solution(int n){
/*
* 因为1+2+...+n=n(n+1)/2,这里把乘法用位操作写出来
* a*b(a>b,这样可以让循环次数少一点)等价于
* res=0;
* while(b){ b=b0*2^0+b1*2^1+...+bn*2^n
* if(b&0x1) res+=a; 若b0=1,res=res+a
* a<<=1; a<<=1等价于a*2
* b>>=1; b>>=1等价于b/2,此时b=b1*2^0+...bn*2^n-1
* }
*/
int a=n+1,res=0;
while(n){
if(n&0x1)
res+=a;
a<<=1;
n>>=1;
}
res>>=1;
return res;
}
}
/*
* 还看到别人有种做法是利用了逻辑与&&的短路特性,但是这个方法的复杂度是O(n)
* 我的方法复杂度是O(logn),n变得很大时就会有速度的差异
*/
class solution{
public:
int Sum_Solution(int n){
int res=n;
//当递归到res=n=0时,逻辑表达式遇到前项res=0就不再计算后项
res&&(res+=Sum_Solution(n-1));
return res;
}
}