不少初学者被上学迟到的问题劝退,但实际上只要运用一定思想便可以破解此类问题
问题如上,要给定一个输出时间,如果按照正常的思路走就是给出如下代码,通过减法来得到时间
#include<stdio.h>
int main()
{
int s, v, time, hour = 0,min=0;
scanf("%d %d", &s, &v);
if (s >= v)//路程比速度大,用不只一分钟
{
if (s % v != 0)
time = s / v + 11;//加上不足的一分钟和分类的10分钟
else
time = s / v + 10;
//恰好路程比速度是整数(共计多少分钟)
hour = time / 60;//算出有多少小时
min = time - hour * 60;//算出除小时外的分钟多长//速度比路程大
}
else//速度比路程大
{
min = 11;
hour = 1;
}
if(hour==0)//不足一小时因为07:XX
{
hour = 1;
printf("%02d:%02d", 8 - hour, 60 - min);
}
else if (time % 60 != 0 && hour != 0)//1小时多的时间还有分钟
{
hour = hour + 1;
printf("%02d:%02d", 8 - hour, 60 - min);
}
else//小时为整数
printf("%02d:%02d", 8 - hour, min);
return 0;
}
但是只能的到改题目的一部分分数,为什么呢
理由如下:
如果是上大学出省,坐火车的同学可能就会超过8个小时就可能到提前一天,但是如果超过8小时,那么该代码所得数就为负
如果再按照这种方式计算,代码量惊人!!!
所以我们选择一种全新的思想,也就是这个题目的核心思想,将时间转换为分钟,因为时间是60进制采用分钟的形式用除法和取余便可以效果惊人
#include<stdio.h>
int main()
{
int s,v,hour, min, time=8*60;//计算24:00时间问题,优先考虑将时间转换为分钟计算
scanf("%d %d", &s, &v);
if (s / v <= 8 * 60 - 10)
{
hour = (time - 10 - s / v) / 60;
if(s%v!=0)
min = (time - 10 - s / v) % 60-1;//不足一分钟按一分钟计算
else
min = (time - 10 - s / v) % 60;
printf("%02d:%02d", hour, min);//占位符%+数字表示占几个字符%02d表示00型,占位符%2可以是12也可以是 1(空1)
//若浮点数即float类型则为%.2f表示两位小数 “ .f ”有一个小点,表示几位小数
}
else
{
time = 24 * 60;//超过一天按照重新1440分钟计算,可以考虑加上一个新定义day
hour= (time - 10 - (s / v-8*60)) / 60;
if (s % v != 0)
min = (time - 10 - (s / v-8*60)) % 60 - 1;//(s/v-8*60)扣除第一天的8小时
else
min = (time - 10 - (s / v-8*60)) % 60;
printf("%02d:%02d", hour, min);
}
return 0;
}
通过转换为分钟的方式我们可以轻松的解决24小时计算时间的问题,同时过去一天的问题也同样得得到了解决
60进制等进制的应用
即先转化为最小单位,再通过除法和取模
就可以轻松解决数据进位的问题
如果你有收获或者帮助你解决了问题,那就留下一个免费的赞吧
如果有不对的地方也随时欢迎指出