剑指offer---47.求1+2+3+...+n

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/weixin_44406146/article/details/102748675

题目描述

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

猜你喜欢

转载自blog.csdn.net/weixin_44406146/article/details/102748675