1. 程式人生 > >劍指offer系列(47):求1+2+3+...+n

劍指offer系列(47):求1+2+3+...+n

題目描述

求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;
	}