PTA基础编程题目集 7-2 然后是几点

文章讲述了作者使用C语言解决时间加减问题的常规思路,涉及小时和分钟的计算,以及如何处理经过时间为负数时的进位问题。后来发现直接利用分钟运算更简洁,但初始解法存在不足,如负数处理和输出格式错误,参考了另一种更高效的解决方案。
摘要由CSDN通过智能技术生成

在这里插入图片描述

题目链接

思路简析

我的思路:

我选择的是非常常规的思路,首先求出输入时间的小时和分钟部分,再求经过时间的小时与分钟部分。最后进行加减法得到新的时间。
值得注意的是:

  1. 最后的相加时,原来时间的分钟部分与过去时间的分钟部分相加可能会大于60,这里要注意进位到小时部分。
  2. 当小时为个位数时,没有前导的零。
  3. 经过的时间可能会为负数

经过思考发现这种思路有点复杂,在处理负数时有点冗余。

参考思路:

【PTA】基础编程题讲解-C语言7-2然后是几点_哔哩哔哩_bilibili
看了下其他解法,发现直接利用分钟来进行运算会简单一些,具体代码见下栏。


解法代码

我的解法
#include<stdio.h>
int main() {
    int oldTime;  //表示当前时间
    int passTime; //表示经过的时间(表示为分钟)
    int newTime;  //最终的时间
    int flag = 0; //用于判断输入的passtime是否为负数   1为是   0为否
    scanf("%d %d",&oldTime, & passTime);
    if (passTime < 0) {  //当经过的时间为负数时,取其相反数化为正数
        passTime = -passTime;
        flag = 1;        
    }

    int oldHour = oldTime / 100;   //求出输入时间的小时部分
    int oldMinute = oldTime % 100; //求出输入时间的分钟部分
    int passHour = 0;              //经过时间的小时部分
    int passMinute = 0;            //经过时间的分钟部分
    while (passTime >= 60) {       //利用while循环将经过时间的小时和分钟部分求出来
        passHour++;
        passTime -= 60;
        passMinute = passTime;     
    }
    if (oldMinute + passMinute >= 60) { //当分钟位大于60,进行进位
        passHour++;
        passMinute -= 60;
    }

    if (flag) {  //经过时间为负数时
        int newHour = oldHour - passHour;
        int newMinute = oldMinute - passMinute;
        newTime = newHour * 100 + newMinute;
    }else{       //经过时间为正数时
        int newHour = oldHour + passHour;
        int newMinute = oldMinute + passMinute;
        newTime = newHour * 100 + newMinute;
    }
    printf("%d",newTime);
    return 0;
}

测试情况如下:image.png
对于负数没处理好,输出格式也不对

参考解法
#include<stdio.h>
int main()
{
    int oldTime, passTime, hour, minute;           
    scanf("%d%d", &oldTime, &passTime);        
    minute = oldTime % 100;                     
    hour = oldTime / 100;                     
    minute += passTime;                       
    while(minute < 0)
    {
        minute += 60;                    
        hour--;                      
    }
    hour += minute / 60;                    
    minute %= 60;                            
    printf("%d%02d\n",hour,minute);      
    return 0;
}

测试通过
image.png


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值