不利用选择结构的一个想法
查看原帖
不利用选择结构的一个想法
755317
wspxsm楼主2022/8/22 22:40

这题出现在顺序结构的题单里,因此思考了下不用选择结构解决这道题的方法。 “不利用选择结构”指不利用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几个部分。下面是代码如何解决的。

1、判断整点

通常的思路是

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,正好满足借位的要求。

2、判断是否在前一天

也类似于借位,当小时数不够了就向“天”位借24小时。因此先加上24.

h=(32-(t_c/60+(t_c%60!=0))

不需要借位时,多出来的同样可以通过取余处理掉。

3、判断补0

printf函数中,可以用"%n0d"进行补0操作。 n表示希望输出的位数,然后输出时不足的位数向前补0.但多出的位数会正常输出。 同样地,"%nd"可以进行补空格操作,原理如上。 因此只需要一行代码。

printf("%02d:%02d",h,m);

萌新的第一次讨论,希望奆佬指点。

2022/8/22 22:40
加载中...