题目要求
根据起始时间和流逝的时间计算出终止时间。
读入两个数字,第一个数字以四位数字(比如 1106 表示 11 点零 6 分)表示当前时间,第二个数字表示分钟数,计算当前时间经过那么多分钟后是几点,结果表示为四位数字。
当小时为个位数时,没有前导的零,例如 5 点 30 分表示为 530;0 点 30 分表示为 030。
第二个数字表示的分钟数可能超过 60,也可能是负数。
输入格式:
输入在一行中给出 2 个整数,分别是四位数字表示的起始时间、以及流逝的分钟数,其间以空格分隔。
输出格式:
输出不多于四位数字表示的终止时间,当小时为个位数时,没有前导的零。题目保证起始时间和终止时间在同一天内。
算法思路1
这个题一开始我是分别判断小时数和分钟数,这样会比较复杂,因为需要考虑小时进位,分钟进位,小时和分钟都有进位,以及小时数为0的特殊情况,所以我就
先将起始时间转化为分钟数,再加上流逝时间,然后进行判断。
minutes1 = hours*60 + minutes +time; //起始时间+流逝时间后表示的分钟数
对分钟数的判断:
minutes1 < 60: 输出时应在minutes前加一个0;
minutes1 == 0 : 输出:000;
60 <= minutes1 <=1440:
不足一天,计算出minutes1表示的小时数hours和分钟数minutes,输出hours*100 + minutes;
minutes1 > 1440 :
minutes1 = minutes1 - (minutes1/1440)*1440,留下不足一天的分钟数,然后再判断以上三种情况,写代码时直接复制上面的代码即可
算法思路2
这个思路是我在写算法思路1时发现的。
先将起始时间转化为分钟数,再加上流逝时间,然后进行判断
第一步:
首先判断 minutes1 >1440
若大于1440,minutes1 = minutes1 - (minutes1/1440)*1440,留下不足一天的分钟数。
第二步:
minutes1 < 60: 输出时应在minutes1前加一个0;
minutes1 == 0 : 输出:000;
60 <= minutes1 <=1440:
不足一天,计算出minutes1表示的小时数hours和分钟数minutes,输出hours*100 + minutes;
这样写的代码会比算法思路1的代码短,但在minutes1<=1440时,会多执行一条if语句。但在minutes1 >1440时,会少执行3条if语句。
一些思考
这两个算法思路也提醒我,在遇到类似的有进位的问题时,可以先判断有进位的情况,把进位的一部分留下来,再和其他未产生进位的情况放在一起判断,而不是按照从小到大的次序判断。
算法思路1代码
#include <stdio.h>
void End_time(int, int); //函数声明
int main()
{
int start, time; //start记录起始时间,time记录流逝的分钟数
scanf("%d %d", &start, &time);
End_time(start, time); //函数调用
return 0;
}
void End_time(int start, int time)
{
int hours, minutes, minutes1;
hours = start/100; //起始时间表示的小时数
minutes = start%100; //起始时间表示的分钟数
minutes1 = hours*60 + minutes +time; //起始时间+流逝时间后表示的分钟数
if(minutes1 < 60 && minutes1 > 0)
{
printf("%d%d", 0, minutes1);
// printf("%c%d", 0, minutes1); //输入030,20,结果是50
}
else
{
if (minutes1 == 0)
printf("000");
else
{
if (minutes1 >= 60 && minutes1 <= 1440) //从一点到24点
{
hours = minutes1 / 60; //小时数
minutes = minutes1 % 60; //分钟数
printf("%d", hours*100 + minutes);
}
else
{
if(minutes1 > 1440)
{
minutes1 = minutes1 - (minutes1/1440)*1440;
if(minutes1 < 60 )
{
printf("%d%d", 0, minutes1);
}
else
{
if (minutes1 == 0)
printf("000");
else
{
hours = minutes1 / 60; //小时数
minutes = minutes1 % 60; //分钟数
printf("%d", hours*100 + minutes);
}
}
}
}
}
}
}
算法思路2代码
#include <stdio.h>
void End_time(int, int); //函数声明
int main()
{
int start, time; //start记录起始时间,time记录流逝的分钟数
scanf("%d %d", &start, &time);
End_time(start, time); //函数调用
return 0;
}
void End_time(int start, int time)
{
int hours, minutes, minutes1;
hours = start/100; //起始时间表示的小时数
minutes = start%100; //起始时间表示的分钟数
minutes1 = hours*60 + minutes +time; //起始时间+流逝时间后表示的分钟数
if(minutes1 > 1440)
{
minutes1 = minutes1 - (minutes1/1440)*1440;
}
if(minutes1 < 60 && minutes1 > 0)
{
printf("%d%d", 0, minutes1);
}
else
{
if (minutes1 == 0)
printf("000");
else
{
hours = minutes1 / 60; //小时数
minutes = minutes1 % 60; //分钟数
printf("%d", hours*100 + minutes);
}
}
}
知识点
输出030
假设minutes1的值是30
printf("%d%d", 0, minutes1); //输出是030
错误写法
printf("%c%d", 0, minutes1); //输出是30
小结
如果你有更高效的代码或建议,请不吝赐教!
如果你觉得这篇文章对你有帮助,请为小白博主点个赞,你的点赞是对小白博主最大的鼓励!