翁恺C语言经典题目解读
7-16 然后是几点
分数 15
作者 翁恺
单位 浙江大学
有时候人们用四位数字表示一个时间,比如 1106 表示 11 点零 6 分。现在,你的程序要根据起始时间和流逝的时间计算出终止时间。
读入两个数字,第一个数字以这样的四位数字表示当前时间,第二个数字表示分钟数,计算当前时间经过那么多分钟后是几点,结果也表示为四位数字。当小时为个位数时,没有前导的零,例如 5 点 30 分表示为 530;0 点 30 分表示为 030。注意,第二个数字表示的分钟数可能超过 60,也可能是负数。
输入格式:
输入在一行中给出 2 个整数,分别是四位数字表示的起始时间、以及流逝的分钟数,其间以空格分隔。注意:在起始时间中,当小时为个位数时,没有前导的零,即 5 点 30 分表示为 530;0 点 30 分表示为 030。流逝的分钟数可能超过 60,也可能是负数。
输出格式:
输出不多于四位数字表示的终止时间,当小时为个位数时,没有前导的零。题目保证起始时间和终止时间在同一天内。
输入样例:
1120 110
输出样例:
1310
鸣谢燕山大学穆运峰老师、用户任钰补充数据!
代码长度限制
16 KB
时间限制
00 ms
内存限制
64 MB
窗体顶端
C (gcc)
首先针对这个题目,按照翁恺老师讲的,第一部分是申请,看变量
第一个变量输入变量是1120
如果我们表示一个时间%d%d来表示,即前面%d表示“11”小时,“20”表示分种,计算机是不能判断是11结束?还是1120结束第一个%d。所以这个表示方法不可取;那我们只能用%d来表示这个输入数据,输入一个四位数1120结束是可以做到的。
第一个变量我们就解决了。
第二个变量就是分钟数,很明显跟第一个变量大不相同,为了保持一样的单位跟格式,我们要么把初始时间换做分钟要么把流逝时间换做小时,要么把流逝分钟数换做小时,由于第二个方法涉及进位,所以我们会选第一个方法
第二步就是算法,我们怎么解决这个问题,明显初始时间换做分钟加上流逝时间的分钟最后换做小时跟分钟的表达形式
第三步我们输出结果
输出结果我们没有像输入时那么复杂了只需不加空格的分别输出小时跟分钟就好,但注意的是分钟数要用02d
最后我们程序是
方法一
#include<stdio.h>
int main(){
int t1,t2;
scanf("%d %d",&t1,&t2);
int t3;
t1=(t1/100)*60+t1%100;
t3=t1+t2;
printf("%d%02d",t3/60,t3%60);
return 0;
}
拓展篇,如果题目改成第二个数据是流逝时间,也由前半部分小时后半部分分钟组成呢?
首先按照翁老师课程里面所讲,写一个程序首先是先看和申请变量
由题目可知
第一个变量输入变量是1120
第二个流逝时间变量是110
第三个变量是最后时间输出变量
那我们应该用什么数据类型,怎么表示
如果我们表示一个时间%d%d来表示,即前面%d表示“11”小时,“20”表示分种,计算机是不能判断是11结束?还是1120结束第一个%d。所以这个表示方法不可取;那我们只能用%d来表示这个输入数据,输入一个四位数1120结束是可以做到的。
第一个变量我们就解决了。
同理我们用一样的方法来输入流逝时间这个变量,不将小时数跟分钟数拆开,也用%d.
此上,我们就把输入变量这个重头戏解决了。
按照翁恺老师所讲,第二部就是算法,就是我们怎么解决这个问题,简单的讲,最后时间不就是初始时间加上流逝时间嘛,可是真的这么简单吗,首先要考虑的是我们输入的是一个四位数,没有意义的四位数,没有区分小时跟分钟,因此我们要小时跟小时计算,分钟跟分钟计算,这时就有了第二个问题那就是分钟会满六十进位,不知道是不是会进位因此我们只要一个if选择结构就可以解决了;至此,我们算法问题解决了;
下一步就是将算法写成我们的程序。
1 四位数分割成有意义的小时跟分钟;
1120;明显11是小时,20是分钟;
因此1120/100=11,就把11小时分离出来了,分钟自热就是1120%100=20;
由此我们可以得到一个规律,运算是可以把/跟%看作另一种风味的“逆运算”。
2 流逝时间分割成小时跟分钟
一样的道理就是110/100=1;110%100=10;
3 最后时间小时加小时,分钟加分钟
4分钟是否进位 if语句解决
5 最后输出怎么输出呢?
明显是一个连续的三位或者四位数,那么“”不需要空格,可是为了分钟部分我们要取02d
Printf(“%d%02d”,h3,m3);
5 最后不要忘记return 0;
最后程序就是
#include <stdio.h>
int main(){
int t1,t2,h3,m3;
scanf("%d %d",&t1,&t2);
h3=t1/100+t2/100;
m3=t1%100+t2%100;
if (m3>=60){h3+=1;
m3-=60;}
printf("%d%02d",h3,m3);
return 0;
}
最后,拓展问题我们解决了