题目描述
求1+2+3+...+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。
样例
输入5
输出15
思路分析
方法一:利用Math类的api实现n(n+1),即Math.pow(n,2) + n
方法二:利用递归,达到循环1+2+...+n的效果,异常处理来结束递归
方法三:同样是递归,利用短路 && 来实现 if的功能,结束递归
方法四:利用位运算来做,快速幂,快速模乘, 原理是把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) + ....
代码
方法一:
public int Sum_Solution(int n) {
return (int) (Math.pow(n, 2) + n) >> 1;
}
方法二:
public int Sum_Solution(int n) {
return sum(n);
}
int sum(int n){
try {
int i = 1 % n;
return n + sum(n-1);
} catch (Exception e) {
return 0;
}
}
方法三:
public int Sum_Solution(int n) {
int sum = n;
boolean flag = (sum>0) && ((sum = sum + Sum_Solution(n-1)) >0);
return sum;
}
方法四:
public int Sum_Solution(int n) {
int res = multi(n, n+1);
return res>>=1;
}
public int multi(int a, int b){
int ans = 0;
boolean flag1 = ((a&1)==1) && (ans = ans + b) > 0;
a >>= 1;
b <<= 1;
boolean flag2 = (a != 0) && (ans = ans + multi(a, b)) > 0;
return ans;
}