劍指offer系列(47):求1+2+3+...+n
阿新 • • 發佈:2018-12-13
題目描述
求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; }