高斯算法:
计算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
}
}