剑指Offer 46 求1+2+3+....n

题目描述

求1+2+3+…+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。

思路

  1. 首先没了上面那些关键字你会发现,你不能循环了,所以你得想办法循环,书上给的是构造函数,但是java默认构造函数不初始化,除非你手动,所以说就不行了
  2. 没有if,你会发现递归的条件不能控制了,和for,while一样,其实我们失去的就是控制边界;那么想法就是如何让程序顺利退出;
    3.下面说三种方法,异常,&&短路运算符,次方运算
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    static public int Sum_Solution1(int n) {
    try {
    int i=1%n; //递归到底,就会抛出异常
    return n+Sum_Solution(n-1);
    }catch (Exception e)
    {
    return 0;
    }
    }
1
2
3
4
5
6
//短路运算符,先算前面
static public int Sum_Solution(int n){
int i = n;
boolean flag = (n>0) && (n+=Sum_Solution(n-1))>0;
return n;
}
1
2
3
4
5
//这个其实是公式(n*(n+1)/2)==(n*n+n)/2;不过左移运算符本来就是除法,所以。。。。。
static public int Sum_Solution2(int n)
{
return (int)(Math.pow(n,2)+n)>>1;
}

收获

  1. 眼界大开啊,各种奇怪的想法;