题目很简单
需要注意的是,在输出中要求每行输出间有一个空行
如果没有注意到这点,很容易出现Presentation Error(格式错误) 即 PE
题目给出的输出范围为32位,所以int就可以解决该问题
解决了这些问题,就可以解题了
比较直接的方法就是暴力循环累加:
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while(sc.hasNext()){
int sum = 0;
int n = sc.nextInt();
for(int i = 1;i<=n;i++){
sum += i;
}
System.out.println(sum);
System.out.println();
}
}
}
显然这并不是这道题的最优解决办法
在很多时候数据是很庞大的,循环并不能很好的解决这类问题
这时可以用到数学中求 等差数列前n项和 的方法
等差数列前n项和公式:
化简可得:S = (a1 + an) * n / 2 即:(首项 + 尾项)* 项数 / 2
所以有如下解法:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while(sc.hasNext()){
int n = sc.nextInt();
System.out.println((1+n)*n/2);
System.out.println();
}
}
}
但是这种写法会WA
因为:
System.out.println((1+n)*n/2);
这步计算中 (1+n)* n 可能会超出32位
我们不妨做个验证,当n=50000时
sum = 1250025000
这是在32位int中的
但计算过程中(1+n)* n = 2500050000 > 2^31-1(int的存储上限)
超出了int的存储上限,所以会WA
解决办法:
WA的原因无非是计算过程中的数超出了int的储存上限,只要避免超出储存上限的话,问题就解决了
最简单的方法就是将运算变为 long 型运算:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while(sc.hasNext()){
int n = sc.nextInt();
System.out.println((1L+n)*n/2);
System.out.println();
}
}
}
可以看到,在运算中的 1 后面加了一个 L ,这样可以将 1 转化成 long 型
int 型与 long 型的值进行运算,运算结果会变成 long 型
这样的话(1+n)* n 就不会因超出上限而出错
第二种解决办法:
如果n是奇数,那么(n+1)就为偶数,则可将式子转化为:
(n + 1)/ 2 * n
这样就不会出现超出上限的情况了,同理,n为偶数:
n / 2 *(n + 1)
代码:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while(sc.hasNext()){
int n = sc.nextInt();
int sum = (n%2==0)?(n/2*(n+1)):((n+1)/2*n);
System.out.println(sum);
System.out.println();
}
}
}