无聊的1+2+...+n

这里写图片描述

思路1

这些关键字都不能用,那么只能用递归去模拟循环,逻辑表达式的短路原则去模拟判断了。

    //用递归替代循环,用&&的短路来替代条件判断
    public int sum(int n) {
        int result = n;
        /*
         * 递归跳出条件,当n>0时,需要判断后续的条件所以会递到sum(n-1)!
         * 当n=0时n>0为假,无需判断后序语句返回result,然后开始回溯!
         */
        boolean b = (n>0)&&((result += sum(n-1))>0);
        return result;
    }

思路2

这是个等差数列求和,那么公式就是S=n(1+n)/2;

这个公式中的除2倒是好解决,用右移运算就行了;问题是如何实现这个乘法?

比较脑洞的解法是利用C语言中sizeof这个运算符了。开一个二维字符数组, 第一维大小为n,第二维大小为n + 1,这样用sizeof去计算这个字符数组的字节数的时候,就会自动执行n * (n + 1)了。


    /*
     * 等差数列求和,那么公式就是S=n(1+n)/2;
     * 这个公式中的除2倒是好解决,用右移运算就行了;
     */
    //使用c语言的sizeof运算符
    public void sum2(int n) {
            char[][] tmp = new char[n][n + 1];
            //java语言不支持
            //int result = sizeof(tmp)>>1;
        }

思路3

同样可以用库函数pow了,n * (n + 1) = pow(n, 2) + n这样子就没有乘法了。

    //用库函数pow了,n * (n + 1) = pow(n, 2) + n这样子就没有乘法了。
    public int sum3(int n) {
        //double类型的数字没有右移运算,所以强转成int
        return (int)(Math.pow(n, 2) + n)>>1;
    }

思路4

使用构造函数

    //使用构造函数
    private static int n = 0;
    private static int sum = 0; 
    public static void Reset(){
        n = 0;
        sum = 0;
    }
    public SumOfOnetoN(){
        ++n;
        sum += n;
    }
    public static int getSum(){
        return sum;
    }

    public int sum4(int num) {
        SumOfOnetoN.Reset();
        SumOfOnetoN arr[] = new SumOfOnetoN[num];
        for(int i=0;i<num;i++)
            arr[i] = new SumOfOnetoN();
        return SumOfOnetoN.getSum();
    }

    @Test
    public void test1() {
        System.out.println(sum4(10));
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值