HDOJ 1036 输入输出 水

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1036

我也不知道这题考查什么,感觉就是考细心。

1.时间要能正确的读,输出的格式要对。

2.结果要四舍五入。


说一下四舍五入的方法,刚从别人那里学的。

假设a为要舍入的数,res为结果。

1.精确到个位。int res = a + 0.5;

2.精确到小数点后第k位。

double a, res, base;
int k;
double base = pow(10.0, k * 1.0);
res = ((int)(a * base + 0.5)) / base;

经简单测试,有效。

PS:上面的高亮显示貌似有问题啊,base不是C++的保留字吧。

下面是解题代码。

#include <iostream>
using namespace std;

int isQualified(char *str)
{
    for (int i = 0;i < strlen(str);i ++)
    {
        if (str[i] == '-')
            return 0;
    }
    return 1;
}

int main ()
{
    int sectionNum;
    double totalDist;
    scanf("%d%lf",&sectionNum,&totalDist);
    char aLine[1000];
    int teamId;
    while (scanf("%d",&teamId) != -1)
    {
        //以秒为单位的总时间
        double timeInSec = 0.0;
        int hour,min,sec;
        int iIsQualified = 1;
        char aRec[100];
        for (int i = 1;i <= sectionNum;i ++)
        {
            //一个记录
            scanf("%s",aRec);
            //如果没有'-',才需要加入总时间
            if (isQualified(aRec))
            {
                sscanf(aRec,"%d:%d:%d",&hour,&min,&sec);
                timeInSec += hour * 3600 + min * 60 + sec;
            }
            else
                iIsQualified = 0;
        }
        if (iIsQualified == 0)
        {
            printf("%3d: -\n",teamId);
            continue;
        }
        double secPerKm = timeInSec / totalDist;
        int resMin = secPerKm / 60;
        int resSec = secPerKm - resMin * 60 + 0.5;
        if (resSec == 60)
        {
            resSec = 0;
            resMin ++;
        }
        //如果resSec是单数,要补0
        printf("%3d: %d:%02d min/km\n",teamId,resMin,resSec);
    }
    return 0;
}
posted @ 2012-08-19 22:35  peaceful  阅读(161)  评论(0)    收藏  举报