7-2 然后是几点 (15 分)

有时候人们用四位数字表示一个时间,比如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);
}

测试点如下:
在这里插入图片描述

  • 12
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 12
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值