剑指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;
	}

 

你可能感兴趣的:(刷题之剑指offer)