今天这道题目呢,是收录在基础编程题目集当中的第二道题目。

难度并不大,但是需要特别仔细,以及考虑全面一些,我在做这道题目的时候,考虑不够周全,就需要对错误一个一个进行排除。

题目具体要求

我们先来看一下这道题目的具体要求:

1、我们可以用具体数值来表示时间,比方说1106表示11时06分。

2、现在需要读入两个数值,第一个数值代表时间,比方说输入1120,则代表11时20分,第二个数值代表分钟数,比方说输入110,则代表现在从11时20分开始,时间往后走110分钟。

3、最终要求得到的结果为1310,则代表13时10分,当然,这只是其中一个测试用例,如果仅仅依据此测试用例来做题的话,容易产生考虑不全的问题。

输入输出都要不超过四位数字表示的时间,且当小时为个位数的时候,没有前导的零。

题目是能保证起始时间和终止时间在同一天内。

逻辑梳理

在完成这道题目之前,我们还是要先来理清楚题目逻辑的。

这道题目的逻辑非常简单,给几个最为简单的实例即可说明。

如下图所示,这就是这道题目所需要测试的几个关键测试点,只要解决了这几个测试点,这道题目也就能够完全解决了。

代码实现

那么,这道题目具体应该怎么来写,这道题目所需要用到的变量应该不少。

当然,对我来说变量的确不少,不知道各位观众老爷有没有更好的方法了。

我是这样理解的:

1、输入起始时间、流逝的分钟数,以及最后需要得到的终止时间,那是不是需要三个变量。

int Time;//起始时间
int m;//流逝的分钟数
int f;//终止时间

2、起始时间的前两位数代表小时数,后两位数代表分钟数,如果要进行加减,主要是要把这两部分的数给拆分开来进行加减。

那么,要得到前两位数,就需要输入的起始时间/100取整数,比方说1120/100取整则得到11时,而要得到后两位数,就需要输入的起始时间/100取余数,比方说1120/100取余则得到20分钟。

int h;//前半段小时
int minute;//后半段分钟
int e;//第一个整数部分的分钟与第二个整数流逝的分钟之和

h = Time/100;//输入的起始时间/100取整数
minute = Time%100;//输入的起始时间/100取余数
e = m + minute;//计算得到的分钟数

3、最复杂需要理解的一部分就在这里

我们知道,60分钟等于一小时,那么当分钟数满足超过60的时候,60的部分就可以进位为一小时,如果是增加时间,那就在小时那部分加1,如果是减少时间,那就在小时那部分减1。

正如我在此之前对题目分析过一样,这里需要对加减之后得到的分钟数进行一个正负判断。

如果为正,就按照正常逻辑走即可,在进行过计算得到的分钟数后,除以60,得到整数则可以加到小时数上,取得的余数也可以用于加。

最终得到的终止时间就可以写做是100*前半部分的小时+后半部分的分钟。

如果为负,则需要换一种思路,在进行过计算得到的分钟数后,除以60,得到整数则可以用小时数来减去这部分整数,如果取得的余数部分仍未负数,那就在进行该整数计算的基础上再额外减去1,余数部分补位+60,得到正数。

最终得到的终止时间就可以写做是前半部分的小时与后半部分的分钟分开来写。

if(e>=0){
q = e/60;//除以60取整进位
w = e%60;//除以60取余代表分钟
r = h+q;//终止时间的小时部分
f = r*100+w;//终止时间
printf("%d", f);
}
else if(e<0){
q = (-e)/60;//除以60取整进位
w = (-e)%60;//除以60取余代表分钟
r = h-q-1;//终止时间的小时部分,需要额外减去一
printf("%d%d", r,60-w);
}

最终正确代码

//然后是几点
#include<;
int main(){
int Time;//起始时间
int m;//流逝的分钟数
int f;//终止时间
int h;//前半段小时
int minute;//后半段分钟
int e;//第一个整数部分的分钟与第二个整数流逝的分钟之和
int q;//加减得到后的分钟数取整,用于小时进位
int w;//加减得到后的分钟数取余,用于计算终止时间的分钟
int r;//终止时间的小时
scanf("%d %d", &Time, &m);
h = Time/100;//输入的起始时间/100取整数
minute = Time%100;//输入的起始时间/100取余数
e = m + minute;//计算得到的分钟数
if(e>=0){
q = e/60;//除以60取整进位
w = e%60;//除以60取余代表分钟
r = h+q;//终止时间的小时部分
f = r*100+w;//终止时间
printf("%d", f);
}
else if(e<0){
q = (-e)/60;//除以60取整进位
w = (-e)%60;//除以60取余代表分钟
r = h-q-1;//终止时间的小时部分,需要额外减去一
printf("%d%d", r,60-w);
}
}

结果测试

第一种情况:1120和110,得到1130。

第二种情况:1120和-110,得到930。

第三种情况:330和-180,得到030。

PTA测试结果

PTA错误结果遇到:

这一部分是我没考虑e的正负的时候。

这一部分是我没考虑当e为正数时的结果打印。

总结

这道题目正好可以训练我们的逻辑思维能力,看看我们能不能理清楚这道题目的逻辑,以及遇到多个变量时应该如何来进行处理,总的来说这道题目存在难度,需要仔细仔细再仔细。

相关推荐