高斯算法——Java实现及效率对比

版权声明:本文为博主原创文章,转载需在开头注明出处 https://blog.csdn.net/zfq_lsh/article/details/84989984

 高斯算法:

        计算1 + 2 + 3 + ... + n 时, 通过收尾相加, 然后乘以最大数/2的方式来实现

/**
 * 高斯算法
 */
public class GaussAlgorithm {

    public static void main(String[] args) {

        long n = 999;

        /*
            常规算法, 当n较大时效率较低
            空间复杂度为 O(n)
         */
        long startTime = System.currentTimeMillis();
        long sum = 0;
        for (int i = 1; i <= n; i ++){
            sum += i;
        }

        long end1 = System.currentTimeMillis();
        System.out.println("normal sum = " + sum + ", case time" + (end1 - startTime));

        /*
            高斯算法, 当n为奇数时需要考虑中位数的问题
            空间复杂度为 O(1)
         */

        long sum2 = (1 + n) * (n >> 1);
        //如果n是奇数的话, 需要在计算结果上加上中位数
        if((n & 1) == 1){
            sum2 += (1 + n) >> 1;
        }

        long end2 = System.currentTimeMillis();
        System.out.println("gauss sum = " + sum2 + ", case time" + (end2 - end1));


        /*
            使用浮点计算, 不用考虑中位数的问题, 但在数据较大时,小数位会出现问题
         */
        double sum3 = (1 + n) * ((float)n / 2);
        long end3 = System.currentTimeMillis();
        System.out.println("gauss sum = " + sum3 + ", case time" + (end3 - end2));

//        n = 99999999L
//        normal sum = 4999999950000000, case time50
//        gauss sum = 4999999950000000, case time0
//        gauss sum = 5.000000136282112E15, case time0

//        n = 999999999
//        normal sum = 499999999500000000, case time457  普通算法
//        gauss sum = 499999999500000000, case time0     高斯算法
//        gauss sum = 4.9999999215337472E17, case time0  使用浮点型数据在计算大数时会出现问题

//        n = 9999999999L
//        normal sum = 0 死掉,几分钟没跑出来
//        gauss sum = -5340232226128654848,  case time0  超出范围, 出现问题
//        gauss sum = 5.000000100204387E19, case time0

    }
}

猜你喜欢

转载自blog.csdn.net/zfq_lsh/article/details/84989984