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

题目来源:浙大PTA https://pintia.cn/problem-sets/14/problems/782

 

看到题目,首先想到把输入的past(我把输入的四位数字表示的起始时间设为变量time,流逝的分钟数设为变量past)变成几小时几分钟来做,在草稿纸上写了一会突然想到可以让time和past统一以分钟为单位,这样就不用一边计算一边转换了,只要最后把结果转换成多少小时多少分钟输出就可以了。

在尝试的过程又发现,time的小时部分变成分钟最后还是要变回小时,那转换成分钟好像有点多此一举了,那就只让time的分钟部分和past(本来就是分钟数)做运算,再把结果转换成多少小时多少分钟加回减去了分钟部分的time里面去。 

 

比如题目给出的样例1120和110 

让1120减去分钟部分的20变为1100,让110加上被减去的这20分钟变为110+20=130,130分钟=2小时+10分钟,把2小时10分钟加到1100里去(在代码中要注意变量的值,小心不要加到值为1120的变量里去了,我一开始时就是这样,把past加上20之后忘了把time减去20,又直接把2小时10分钟加到time(此时time因为没有减去20所以值还是1120)里去了),答案应该是1310,1310=1100+2×100+10(这里不用担心分钟部分的结果会出现超出60要进位的情况,因为在前面做130分钟=2小时+10分钟(130÷60=2······10)这个运算的时候就已经保证了剩下的分钟数(余数)不会超过60。

我在考虑past大于0和小于0的情况的时候,一开始在小于0的情况下写最后的结果是time-100+60-a-100*b(a是分钟数是负数,但是我以为是正数,所以写的是减a,b是小时数也是负数,但我也以为是正数,所以写的是减100*b),正确的应该是time-100+60+a+100*b  

我不确定负数除以60得到的商和余数是正数还是负数,就去devc++上调试了,得到是商和余数都是负的,所以我把小于0的情况更正了。 

一直都还没有考虑当小时为零点的时候的情况,考虑到的时候我就在main里面多加了if语句,当time小于100时在输出时在前面补零,靠着印象写成了printf("%3d",time);但在devc++试的时候没得到正确的结果,输出的还是两位数前面没有补上0,百度之后发现原来是%03d。 

 

做题的时候拿上笔和纸写一写,遇上不确定结果的代码也随时调试和百度。 

这条题还挺快做出来的。

在网上看了一下别人的答案,发现我的答案比较繁琐比别人多了好多行(···)[/捶桌]  ,但我也没去试了 。

 

 1 

 1 #include<stdio.h>
 2 int change(int time,int past);
 3 int main(){
 4     int time,past;
 5     scanf("%d %d",&time,&past);
 6     time=change(time,past);
 7     if(time<100){
 8         printf("%03d",time);
 9     }else{
10         printf("%d",time);
11     }
12     return 0;
13 }
14 int change(int time,int past){
15     if(past==0){
16         return time;
17     }
18     int a;
19     int b;
20     a=time%100;
21     past=past+a;
22     time=time-a;
23     a=past%60;
24     b=past/60;
25     if(past>0){
26         return time+a+100*b;
27     }else{
28         return time-100+60+a+100*b;
29     }
30 }

 

posted @ 2021-03-24 01:12  Listendown  阅读(404)  评论(0)    收藏  举报