这题出现在顺序结构的题单里,因此思考了下不用选择结构解决这道题的方法。 “不利用选择结构”指不利用if语句、switch语句和三目运算符。用逻辑值应该不算选择结构吧? 代码如下:
#include <cstdio>
#include <cmath>
using namespace std;
double t,s,v;
int h,m,t_c;
int main(){
scanf("%lf%lf",&s,&v);
t=s/v;
t_c=ceil(t)+10;
m=(60-t_c%60)%60;
h=(32-(t_c/60+(t_c%60!=0)))%24;
printf("%02d:%02d",h,m);
return 0;
}
看了下题解中用选择结构的部分,主要用于判断是否整点、判断是否在前一天、是否要补0几个部分。下面是代码如何解决的。
通常的思路是
m=60-t_c%60;
h=8-t_c/60-1; //先借一位
if(m==60){
m=0;
h++;
}
如果不用if,因为分钟数有不超过60的特点,可以用取余运算,将60变为0。 同时对于小时数是否要借位,可以用时间除以60的余数。余数不为零时表示要借位,而逻辑表达式
(t_c%60!=0)
当为真时返回1,假时返回0,正好满足借位的要求。
也类似于借位,当小时数不够了就向“天”位借24小时。因此先加上24.
h=(32-(t_c/60+(t_c%60!=0))
不需要借位时,多出来的同样可以通过取余处理掉。
printf函数中,可以用"%n0d"进行补0操作。 n表示希望输出的位数,然后输出时不足的位数向前补0.但多出的位数会正常输出。 同样地,"%nd"可以进行补空格操作,原理如上。 因此只需要一行代码。
printf("%02d:%02d",h,m);
萌新的第一次讨论,希望奆佬指点。