版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
题目描述
求1+2+3+…+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。
解法一:利用java异常处理
public class Solution {
public int Sum_Solution(int n) {
return sum(n);
}
private int sum(int n){
try{
int error = 1%n;
return n+sum(n-1);
}catch(Exception e){
return 0;
}
}
}
解法二:利用短路
public class Solution {
public int Sum_Solution(int n) {
int sum = n;
boolean flag = n>0&&(sum += Sum_Solution(n-1))!=0;
return sum;
}
}
解法三:快速幂
public class Solution {
public int Sum_Solution(int n) {
int a = n, b = n + 1, s = 0;
//复制32次。。
s += b & f(a); a >>= 1; b <<= 1;
s += b & f(a); a >>= 1; b <<= 1;
s += b & f(a); a >>= 1; b <<= 1;
s += b & f(a); a >>= 1; b <<= 1;
s += b & f(a); a >>= 1; b <<= 1;
s += b & f(a); a >>= 1; b <<= 1;
s += b & f(a); a >>= 1; b <<= 1;
s += b & f(a); a >>= 1; b <<= 1;
s += b & f(a); a >>= 1; b <<= 1;
s += b & f(a); a >>= 1; b <<= 1;
s += b & f(a); a >>= 1; b <<= 1;
s += b & f(a); a >>= 1; b <<= 1;
s += b & f(a); a >>= 1; b <<= 1;
s += b & f(a); a >>= 1; b <<= 1;
s += b & f(a); a >>= 1; b <<= 1;
s += b & f(a); a >>= 1; b <<= 1;
s += b & f(a); a >>= 1; b <<= 1;
s += b & f(a); a >>= 1; b <<= 1;
s += b & f(a); a >>= 1; b <<= 1;
s += b & f(a); a >>= 1; b <<= 1;
s += b & f(a); a >>= 1; b <<= 1;
s += b & f(a); a >>= 1; b <<= 1;
s += b & f(a); a >>= 1; b <<= 1;
s += b & f(a); a >>= 1; b <<= 1;
s += b & f(a); a >>= 1; b <<= 1;
s += b & f(a); a >>= 1; b <<= 1;
s += b & f(a); a >>= 1; b <<= 1;
s += b & f(a); a >>= 1; b <<= 1;
s += b & f(a); a >>= 1; b <<= 1;
s += b & f(a); a >>= 1; b <<= 1;
s += b & f(a); a >>= 1; b <<= 1;
s += b & f(a); a >>= 1; b <<= 1;
return s >> 1;
}
private int f(int a){
return ((a&1)<<31)>>31;
}
}
//便于理解是这个
public static int Sum_Solution2(int n) {
int res = 0;
int a = n;//若a=2=10
int b = n + 1;//b=3=11
while (a != 0) {
if ((a & 1) == 1)//a在第二位==1的时候才更新res=0+110=6
res += b;
a >>= 1;//a右移1位 1
b <<= 1;//b左移动1位 110
}
return res>>=1;//n(n+1)/2 }
解法四:同上递归写,都他妈是神仙
public class Solution {
public int Sum_Solution(int n) {
return sum(n,n+1)>>1;
}
private int sum(int a,int b){
int ans = 0;
boolean flag1 = ((a&1)==1)&&(ans += b)>0;
a >>= 1;
b <<= 1;
boolean flag2 = (a!=0)&&(ans += sum(a,b))>0;
return ans;
}
}