7-2 然后是几点

题目要求

根据起始时间和流逝的时间计算出终止时间。
读入两个数字,第一个数字以四位数字(比如 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

小结

如果你有更高效的代码或建议,请不吝赐教!
如果你觉得这篇文章对你有帮助,请为小白博主点个赞,你的点赞是对小白博主最大的鼓励!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值