7-2 然后是几点 (15 分)
程序员文章站
2022-06-07 09:51:53
...
有时候人们用四位数字表示一个时间,比如1106表示11点零6分。现在,你的程序要根据起始时间和流逝的时间计算出终止时间。
读入两个数字,第一个数字以这样的四位数字表示当前时间,第二个数字表示分钟数,计算当前时间经过那么多分钟后是几点,结果也表示为四位数字。当小时为个位数时,没有前导的零,即5点30分表示为530。注意,第二个数字表示的分钟数可能超过60,也可能是负数。
输入格式:
输入在一行中给出2个整数,分别是四位数字表示的起始时间、以及流逝的分钟数,其间以空格分隔。注意:在起始时间中,当小时为个位数时,没有前导的零,即5点30分表示为530;流逝的分钟数可能超过60,也可能是负数。
输出格式:
输出四位数字表示的终止时间。题目保证起始时间和终止时间在同一天内。
输入样例:
1120 110
输出样例:
1310
这个题我一看到就有点头大,差点以为要像王道那本书上算日期了,后来发现是自己想的太复杂了,所以导致有一个测试点总是卡主。
之前的思路是把小时和分钟这四位放入一个数组中,然后对间隔时间/60得到小时数,对间隔时间%60得到分钟数,分别与初始时间相加,但是这样做存在的问题是满60分钟如何做到进位?如果是负的,怎么借位?这两个问题可以通过加判断条件来解决。最后那个点总是卡主,我也是醉了,一度怀疑自己,分钟数小于0,输出不满4位,我没读明白什么意思。
有时候转换一下思维,以这道题为例,可以把小时数转换成分钟数,最后转为小时+分钟,这样可以避免满60分钟未进位的情况。
原来的思路:
#include<stdio.h>
int main()
{
int nowtime,time,num[4],aftertime,i;
scanf("%d%d",&nowtime,&time);
for(i=3;i>=0;i--)
{
num[i]=nowtime%10;
nowtime/=10;
}
int hour=0,minute=0;
hour=num[0]*10+num[1];
minute=num[2]*10+num[3];
int k=time;
while(time>0)
{
minute++;
if(minute==60)
{
hour++;
minute=0;
}
time--;
}
while(time<0)
{
minute--;
if(minute==0)
{
hour--;
minute=60;
}
time++;
}
if(minute==60)
{
hour++;
minute=0;
}
num[0]=hour/10;
num[1]=hour%10;
num[2]=minute/10;
num[3]=minute%10;
for(i=0;i<4;i++)
{
printf("%d",num[i]);
}
return 0;
}
修改后
#include <stdio.h>
#include <math.h>
int main (void)
{
int start, min1;
int min2, time;
int end;
scanf("%d%d", &start, &min1);
min2 = start / 100 * 60 + start % 100;//计算start表示的时间距离00:00有多少分钟,将小时数转换为分钟,避免出现未进位的情况
time = min2 + min1;
end = time / 60 *100 + time % 60;
printf ("%d", end);
}
测试点如下:
下一篇: 6-1 有序数组(类模板)(10 分)