[ACM]No.0002 [HDOJ 1001]Sum Problem

[ACM]No.0002 [HDOJ 1001]Sum Problem

ACM每日一题汇总

来源: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}}] ,&amp; \text{(} x \in \mathbb{2N} \text{)}; \\ { (1+M) * [\frac{M}{2}}] + \frac{ (1+M)}{2} ,&amp; \text{(} x \in \mathbb{2N + 1} \text{)}; \\ \end{cases} \end{aligned} D(x)={(1+M)[2M],(1+M)[2M]+2(1+M),(x2N);(x2N+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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值