HUD-1001 Sum Problem 解题报告

题目很简单

需要注意的是,在输出中要求每行输出间有一个空行

如果没有注意到这点,很容易出现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项和公式:

formula

化简可得: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();
		}
	}

}

猜你喜欢

转载自blog.csdn.net/Timo_Max/article/details/81312191