Sum Problem
In this problem, your task is to calculate SUM(n) = 1 + 2 + 3 + … + n.
Input
The input will consist of a series of integers n, one integer per line.
Output
For each case, output SUM(n) in one line, followed by a blank line. You may assume the result will be in the range of 32-bit signed integer.
Sample Input
1
100
Sample Output
1
5050
初始写法
看到题目的时候觉得,可以使用for循环做。不过为了偷懒,就直接套用公式来解题。
#include<stdio.h>
int main()
{
int n=0;
int sum=0;
scanf("%d",&n);
do{
sum=(1+n)*n/2;
printf("%d\n\n",sum);
}
while(scanf("%d",&n)!=EOF);
return 0;
}
自己感觉很正确,调试一下,答案也没有什么问题。但在OJ上是wrong answer。
然后我去百度了一下,看到一个博主也是犯了同样的错误。
然后那个博客的链接:
hdu1001 Sum Problem 差点被这个题玩死了
大概是因为题目要求是求和结果是32位有符号整数,而n*(n+1)乘法的时候,会溢出。
所以先(n+1)/2再n或者n/2再(n+1),使得它在运算过程中不会溢出。
修改后
#include<stdio.h>
int main()
{
int n=0;
int sum=0;
scanf("%d",&n);
do{
sum=(1+n)/2.0*n;
sum=(int)sum;
printf("%d\n\n",sum);
}
while(scanf("%d",&n)!=EOF);
return 0;
}
在这道题中吸取的一个教训: 注意运算过程中的溢出。
个人设想,在做题时是否应将除法放置于乘法前,以避免运算中的溢出。