7-15 然后是几点

有时候人们用四位数字表示一个时间,比如 1106 表示 11 点零 6 分。现在,你的程序要根据起始时间和流逝的时间计算出终止时间。

读入两个数字,第一个数字以这样的四位数字表示当前时间,第二个数字表示分钟数,计算当前时间经过那么多分钟后是几点,结果也表示为四位数字。当小时为个位数时,没有前导的零,例如 5 点 30 分表示为 530;0 点 30 分表示为 030。注意,第二个数字表示的分钟数可能超过 60,也可能是负数。

输入格式:

输入在一行中给出 2 个整数,分别是四位数字表示的起始时间、以及流逝的分钟数,其间以空格分隔。注意:在起始时间中,当小时为个位数时,没有前导的零,即 5 点 30 分表示为 530;0 点 30 分表示为 030。流逝的分钟数可能超过 60,也可能是负数。

输出格式:

输出不多于四位数字表示的终止时间,当小时为个位数时,没有前导的零。题目保证起始时间和终止时间在同一天内。

输入样例:

1120 110

输出样例:

1310

鸣谢燕山大学穆运峰老师、用户任钰补充数据!

代码长度限制

16 KB

时间限制

400 ms

内存限制

64 MB

我的答案:
一、信息

1.用四位数表示时间

2.根据起始时间和流逝时间计算出终止时间

3.输入规则:第一个数是四位数表示时间,第二个数用分钟表示时间

4.小时数个位没有前导0

5.第二个数字可能分钟数超过六十且有可能为负数

二、分析

问题1:如何用四位数表示时间

我的答案:直接用int型表示就可以了

问题2:如何实现根据起始时间和流逝时间计算出终止时间

我的答案:

由于分钟和小时的模不一样所以我们把问题分解成两部分即小时部分和分钟部分。

小时进位:输出不多于四位数字表示的终止时间,当小时为个位数时,没有前导的零。题目保证起始时间和终止时间在同一天内。

这里错了——如果大于23那么就-24在同一天

第一部分为小时 第二部分为分钟
首先对分钟数进行除60,因为1h=60min且,数据是整型会导致精度丢失所以通过这个就能算出这个分钟占了多少小时这样把算出的小时和初始相加这样就得到了,然后考虑分钟问题这里我们通过对60取余就可以得到剩余的不满一小时的分钟数然后和分钟部分相加,这里就会出现两种情况

分钟进位

第一种是不进位

不进位那么我们就直接相加即可

第二种是进位

那么我们相加后先判断它是否大于60如果大于小时部分加1然后直接加在一起然后再减60.

我的错误答案:

#include<stdio.h>
int main(){
	int now,time,after,timehour,timeminute,nowhour,nowminute,afterhour,afterminute;
	scanf("%d %d",&now,&time);
	nowhour=now/60;
	nowminute=now%60;
	timehour=time/60;
	timeminute=time%60;
	afterhour=nowhour+timehour;
	afterminute=nowminute+timeminute;
	if(afterminute>60){
		afterminute=afterminute-60;
	}
	after=afterhour*100+afterminute;
	printf("%d",after);
} 

运行结果:

错误原因:

我的程序存在以下几个问题:

  1. 错误的时间单位
    我把小时当做了60分钟,这是错误的。小时应该用100来分割,因为输入的四位数时间表示中,前两位是小时,后两位是分钟。

  2. 分钟处理不全面
    如果afterminute超过60,我只减去了60。但考虑到流逝时间可以超过60分钟(例如120分钟、180分钟等),所以这样处理是不够的。你还需要处理afterminute的进位。

  3. 没有处理小时的进位
    如果afterhour超过24,需要循环到0-23之间。

  4. 没有处理负数情况
    据题意,流逝时间可以是负数,所以你需要处理这种情况。

考虑上述问题,我将修改我的程序:

C语言:

#include<stdio.h>
int main(){
    int now, time, after, timehour, timeminute, nowhour, nowminute, afterhour, afterminute;
    scanf("%d %d", &now, &time);
    
    nowhour = now / 100;      // 修改为100,用于提取小时
    nowminute = now % 100;    // 修改为100,用于提取分钟
    
    timehour = time / 60;     // 时间的小时部分由分钟转化而来
    timeminute = time % 60;
    
    afterhour = nowhour + timehour;
    afterminute = nowminute + timeminute;
    
    // 更完善的分钟处理
    while(afterminute >= 60) {
        afterhour++;
        afterminute -= 60;
    }
    while(afterminute < 0) {
        afterhour--;
        afterminute += 60;
    }
    
    // 处理小时的进位
    afterhour %= 24;
    
    after = afterhour * 100 + afterminute;
    printf("%d", after);
    return 0;
}

 C++:
 

#include <iostream>
using namespace std;

int main() {
    int start, elapsed;
    cin >> start >> elapsed;

    int hours = start / 100;
    int minutes = start % 100;

    // Add elapsed minutes to the current time
    minutes += elapsed;

    // Process the carry for minutes
    while (minutes >= 60) {
        hours++;
        minutes -= 60;
    }
    while (minutes < 0) {
        hours--;
        minutes += 60;
    }

    // Process the carry for hours
    hours %= 24;

    cout << hours;
    if (minutes < 10) {
        cout << "0";
    }
    cout << minutes << endl;
    return 0;
}

总结:

反思:

1. **错误的时间单位**:  
   - 我使用了`60`作为小时和分钟之间的分隔。这是不正确的,应该使用`100`来分隔。例如,`1120`表示`11`小时`20`分钟,而不是`18`小时`40`分钟。

   处理方案:仔细阅读和理解题目要求。确保正确理解了输入和输出格式。

2. **没有处理时间的循环性**:  
   - 如果`afterminute`超过`60`,我只减去了`60`。但是,可能存在多个小时的增加,因此需要循环处理。
   - 没有处理小时数超过`24`的情况。

   **建议**处理方案:考虑所有可能的边界情况。在时间问题中,经常需要处理时间的循环性。

3. **错误的时间进位**:  
   - 当分钟数超过60时,小时数应该加1。

   处理方案:确保逻辑和算法是正确的,注意进位和借位的情况。

4. **冗余的变量**:
   - 我定义了`timehour`和`timeminute`,但在时间问题上,我们不需要把流逝的时间转化为小时和分钟,因为我们可以直接添加或减去分钟。

  处理方案:减少不必要的变量和计算,简化代码。

5. **没有考虑负的流逝时间**:  
   - 根据题目描述,流逝的时间可以是负数,但我的代码没有处理这种情况。

   处理方案:总是检查题目是否有特殊或边界情况,并确保代码处理了这些情况。

综上所述,我的代码需要一些重要的修改才能解决这个问题。确保我深入理解题目的需求,并思考所有可能的输入情况。

背后缺失的能力:

1. **细致的阅读能力**:
    - 我可能没有仔细阅读或完全理解题目的要求,导致对小时和分钟的处理存在误解。
   
    **提高方法**: 
    - 当我遇到问题描述时,多次阅读并尝试总结关键信息。
    - 练习时,可以尝试做题后自己写题目的简化版本,看是否能准确捕捉关键点。

2. **逻辑思维与分析能力**:
    - 我在处理时间进位的逻辑上出现了漏洞,如分钟超过60只减去了60,没有处理小时的增加。
   
    **提高方法**:
    - 经常练习逻辑题和算法题,特别是那些需要深入思考和多步骤解答的题目。
    - 分析已有的解决方案,尝试理解其背后的逻辑,并自己手动模拟算法的执行过程。

3. **测试与验证能力**:
    - 根据我给出的代码,可能没有进行充分的测试,尤其是边界情况。
    
    **提高方法**:
    - 编写代码后,总是使用多种测试用例进行测试,包括常规情况、边界情况和可能的异常情况。
    - 学习使用断点和调试工具,它们可以帮助你更好地理解代码的执行流程并找出问题。

4. **问题解决策略**:
    - 代码中存在一些不必要的变量和处理,可能没有选择最佳的策略来解决问题。
    
    **提高方法**:
    - 当遇到问题时,先花时间思考并计划解决策略,而不是立即开始编码。
    - 分析不同的策略,评估其优劣,然后选择一个执行。

5. **学习与反思**:
    - 对已知的问题和错误进行深入的分析和反思,这是提高编程技能的关键。
   
    **提高方法**:
    - 在遇到问题或错误时,尝试自己找出原因并修复,而不是立即寻求帮助。
    - 反思每次编码的经验,总结学到的内容,并记录下来。

最后,不要灰心。每个人在学习编程的过程中都会犯错误。关键是从中学习并不断提高。多练习,勤于思考,经常反思,随着时间的推移,你会看到显著的进步。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夏驰和徐策

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值