题目
写一个程序,返回从第一个数到num这个数的总和。该些数字将始终是一个大于0的正整数。
例如:
summation(2) -> 3
1 + 2
summation(8) -> 36
1 + 2 + 3 + 4 + 5 + 6 + 7 + 8
测试用例:
import java.util.Random;
import static org.junit.Assert.assertEquals;
import org.junit.Test;
public class GrassHopperTest {
@Test
public void test1() {
assertEquals(1,
GrassHopper.summation(1));
}
@Test
public void test2() {
assertEquals(36,
GrassHopper.summation(8));
}
}
解题
我的:
public class GrassHopper {
public static int summation(int n) {
int sum = 0;
for(int i = 0; i < n + 1; i++) {
sum += i;
}
return sum;
}
}
别人的:
1、我又忘记算法公式这种方法了。
public class GrassHopper {
public static int summation(int n) {
return n*(n+1)/2;
}
}
2、stream大法
import java.util.stream.IntStream;
public class GrassHopper {
public static int summation(int n) {
return IntStream.rangeClosed(1,n).sum();
}
}
3、递归法,之前也有想到该方法
public class GrassHopper {
public static int summation(int n) {
if (n == 1)
return 1;
return summation(n-1) + n;
}
}
4、公式法变种,位运算比/运算快
public class GrassHopper {
public static int summation(int n) {
return (n * (n+1)) >> 1;
}
}
思考
小题目也可以有多解答。