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++;}的话就既不会出现精度问题,也只涉及整型计算,效率更高。