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 }

浙公网安备 33010602011771号