c语言90分,第九个点过不去,求助大佬

P5707 【深基2.例12】上学迟到

yoiuqiou @ 2023-09-21 22:05:00

#include<stdio.h>
#include<math.h>
int main()
{
    int time,s,c,v,m,H,M;
    double t;
    scanf("%d%d", &s, &v);
    t = 1.0 * s / v;
        t = round(t + 0.5);
    time = t;
    if (time <= 470)
    {
        m = 470 - time;
    }
    else
    {
        m = 1910 - time;//考虑一天前的情况
    }
    M = m % 60;
    H = (m - M) / 60;
    if(H<10)
    {
        if(M<10)
        {
            printf("0%d:0%d", H, M);
        }
        else
        {
            printf("0%d:%d", H, M);
        }
    }
    else     
    {
        if (M < 10)
        {
            printf("%d:0%d", H, M);
        }
        else
        {
            printf("%d:%d", H, M);//分类讨论0H:0M,0H:MM,HH:0M,HH:MM的情况
        }
    }
}

by Cload_Honor @ 2023-09-21 22:29:41

#include<stdio.h>
#include<math.h>
int main()
{
    int time,s,c,v,m,H,M;
    int t;
    scanf("%d%d", &s, &v);
    t = s / v;
    if (s % v) {
        t++;
    }
    time = t;
    if (time <= 470)
    {
        m = 470 - time;
    }
    else
    {
        m = 1910 - time;
    }
    M = m % 60;
    H = (m - M) / 60;
    if(H<10)
    {
        if(M<10)
        {
            printf("0%d:0%d", H, M);
        }
        else
        {
            printf("0%d:%d", H, M);
        }
    }
    else     
    {
        if (M < 10)
        {
            printf("%d:0%d", H, M);
        }
        else
        {
            printf("%d:%d", H, M);
        }
    }
}

by Cload_Honor @ 2023-09-21 22:38:24

@yoiuqiou 调好了


by yoiuqiou @ 2023-09-22 07:15:54

谢谢大佬@C_handsome

还有一个问题就是:

t = round(t + 0.5);time = t;和if (s % v) {t++;}都是实现向上取整,但是为什么前者在题目中第九个监测点wa,而后者则可以完美通过呢?


by Cload_Honor @ 2023-09-22 20:20:49

@yoiuqiou 这个我也不知道,用ceil的话就只有#9对了


by Cload_Honor @ 2023-09-22 20:32:39

@yoiuqiou 主要我是学c++的,c就学过一点,所以蒟蒻帮不了太大的忙


by Cload_Honor @ 2023-09-22 20:34:16

@yoiuqiou 似乎是精度问题


by Cload_Honor @ 2023-09-22 20:42:01

@yoiuqiou 对了这个输出可以这样

if (H < 10) {
    printf("0");
}
printf("%d", H);
printf(":");
if (M < 10) {
    printf("0");
}
printf("%d", M);

by yoiuqiou @ 2023-09-23 10:17:08

@C_handsome

谢谢大佬,已经帮我很多啦。

后面的输出也是,太巧妙了!我根本没想到。

还有就是关于t=round(t+0.5);time=t;的问题。确实存在精度问题,尤其是当t非常大或者非常小的时候,超过了double的精度的就会出问题。比如round(0.5+10^-100)就会输出0而不是理论上的1。

并且还有就是t= round(t+0.5); 会涉及到浮点数的运算,效率比较低。如果是if (s % v) {t++;}的话就既不会出现精度问题,也只涉及整型计算,效率更高。


|