题目描述
求1+2+3+...+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。
一,利用利用短路 && 来实现 if的功能;
二,利用递归来实现循环while的功能
递归(使用&&的短路性质)
class Solution { public: int Sum_Solution(int n) { int ans = n; ans&&(ans += Sum_Solution(ans-1)); return ans; } };
不使用乘法求乘法:
把a拆成2的幂的和,a = 2^e0 + 2^e1 + 2^e2....
a * b = (2^e0 + 2^e1 + 2^e2+...) * b
= b * 2^e0 + b * 2^e1 + b * 2^e2 + ...
= (b << e0) + (b << e1) + ....
= (b << e0) + (b << e1) + ....
利用循环求n*(n-1)/2
int Sum_Solution(int n) { int a = n; int b = n+1; int result = 0; while(a){ if(a&1){ result += b; } a = a>>1; b = b<<1; } return result>>1; }
class Solution { public: int Sum_Solution(int n) { int result = Sum_Solution(n,n+1); return result>>1; } int Sum_Solution(int a,int b) { int sum = 0; (a&1 == 1) && (sum += b); (a!=0) && (sum += Sum_Solution(a>>1,b<<1)); return sum; } };