[ACM]No.0002 [HDOJ 1001]Sum Problem
来源:HDU - Problem Archive
来源:http://acm.hdu.edu.cn/showproblem.php?pid=1001
Time Limit: 1000/500 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 626069 Accepted Submission(s): 158409
Problem Description
Hey, welcome to HDOJ(Hangzhou Dianzi University Online Judge).
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
Author
DOOM III
Recommend
We have carefully selected several similar problems for you: 1002 1090 1003 1091 1004
Solve1(Time Limit Exceeded)
直接模拟相加
// Time Limit Exceeded
#include<bits/stdc++.h>
using namespace std;
long long calculate( int m ){
long long result=1;
for( int i=2;i<=m;i++ ){
result += i;
}
return result;
}
int main(){
int M;
while( scanf("%d", &M)!=EOF ){
if( !M )
printf("%d\n", 0);
else
printf("%lld\n", calculate(M));
printf("\n");
}
return 0;
}
Solve2(Wrong Answer)
使用Solve1直接模拟相加,会超时。
等差数列求和公式:
S
u
m
(
M
)
=
(
1
+
M
)
∗
M
2
Sum(M) =\frac{ (1+M)*M}{ 2}
Sum(M)=2(1+M)∗M
// Wrong Answer
#include<bits/stdc++.h>
using namespace std;
long long calculate( int m ){
long long result=1;
result = ((1 + m) * m) / 2;
return result;
}
int main(){
int M;
while( scanf("%d", &M)!=EOF ){
if( !M )
printf("%d\n", 0);
else
printf("%lld\n", calculate(M));
printf("\n");
}
return 0;
}
Solve3(Accepted)
由于浮点数的问题,Solve2在奇数运行不通过。所以需要奇偶数,奇数还要加上中间值。
D
(
x
)
=
{
(
1
+
M
)
∗
[
M
2
]
,
(
x
∈
2
N
)
;
(
1
+
M
)
∗
[
M
2
]
+
(
1
+
M
)
2
,
(
x
∈
2
N
+
1
)
;
\begin{aligned} D(x) = \begin{cases} { (1+M) * [\frac{M}{2}}] ,& \text{(} x \in \mathbb{2N} \text{)}; \\ { (1+M) * [\frac{M}{2}}] + \frac{ (1+M)}{2} ,& \text{(} x \in \mathbb{2N + 1} \text{)}; \\ \end{cases} \end{aligned}
D(x)={(1+M)∗[2M],(1+M)∗[2M]+2(1+M),(x∈2N);(x∈2N+1);
#include<bits/stdc++.h>
using namespace std;
long long calculate( int m ){
long long result=1;
if( m%2==0 ){
result = (1+m) * (m/2);
} else {
result = (1+m) * (m/2) + (m/2+1);
}
return result;
}
int main(){
int M;
while( scanf("%d", &M)!=EOF ){
if( !M )
printf("%d\n", 0);
else
printf("%lld\n", calculate(M));
printf("\n");
}
return 0;
}