欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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);
}

测试点如下:
7-2 然后是几点 (15 分)

相关标签: pta