第二章选择结构练习

第二章 选择结构练习

  • ❥(^_-)第一题 解一元二次方程
  • ❥(^_-)第二题 游戏时长


❥(^_-)第一题 解一元二次方程


1.已知方程式 a x 2 + b x + c = d ax^2+bx+c=d ax2+bx+c=d,该方程系数 a 、 b 、 c 、 d a、b、c、d abcd待定。当 a a a为0时,该方程为一元一次方程,当 a ≠ 0 a\neq0 a=0时,该方程为一元二次方程。现给定方程系数,解出该方程的解。

输入格式:第一行输入4个双精度浮点数,分别表示 a 、 b 、 c 、 d a、b、c、d abcd
输出格式: 若方程为一元一次方程,输出格式为: x = 解 x=解 x=

若方程为一元二次方程:
(1)有虚数解,输出格式为: x 1 = 实部 + 虚部 i , x 2 = 实部 − 虚部 i x1=实部+虚部i,x2=实部-虚部i x1=实部+虚部i,x2=实部虚部i
(2)若只有一个解,输出格式为: x 1 = x 2 = 解 x1=x2=解 x1=x2=
(3)若有两个解,输出格式为: x 1 = 解 1 , x 2 = 解 2 x1=解1,x2=解2 x1=1,x2=2 (大的解在前)
【输出结果中的实部虚部以及解都 保留 4 位小数 \color{red}保留4位小数 保留4位小数。】

输入样例1:
0 5 2 1
输出样例1:
x = -0.2000

输入样例2:
1 -3 1 -1
输出样例2:
x1=2.0000,x2=1.0000

输入样例3:
1 -16 64 0
输出样例3:
x1=x2=8.0000

输入样例4:
1 -10 52 23
输出样例4:
x1=5.0000+2.0000i,x2=5.0000-2.0000i


思路: 在本题中需要了解求解一元二次方程的基本的公式。
已知方程: a x 2 + b x + c = 0 ax²+bx+c=0 ax2+bx+c=0则该方程的解为: x = − b ± b 2 − 4 a c 2 a {x=\dfrac{-b\pm\sqrt {b^2-4ac}}{2a}} x=2ab±b24ac
若该一元二次方程的 b 2 − 4 a c < 0 b^2-4ac<0 b24ac<0,则该方程对应的虚数解应为: x = − b 2 a + ∣ b 2 − 4 a c ∣ 2 a i { x=\dfrac{-b}{2a} + \dfrac{\sqrt{\left|b^2-4ac\right|}}{2a}i } x=2ab+2ab24ac i
通过判断 Δ = b 2 − 4 a c \Delta=b^2-4ac Δ=b24ac的取值即可求解该一元二次方法。
当然特别需要注意的是当 a a a的系数为0的时候该方程为一元一次方程。


代码:

#include 
#include 

int main()
{
	double a, b, c, d;
	scanf("%lf%lf%lf%lf", &a, &b, &c, &d);
	if(a == 0) 
	{
		// 求解一元一次方程
		double x = (d - c) / b;
		printf("x = %.4f\n", x);
	}
	else
	{
		// 定义根判别式,求解一元二次方程
		double derta;
		derta = pow(b, 2) - 4 * a * (c - d);
		if(derta < 0)
		{
			// 两个虚数根
			double real, image;
			real = -b / (2 * a);
			image = sqrt(-derta) / (2 * a);
			printf("x1=%.4f+%.4lfi,x2=%.4f-%.4fi\n", real, image, real, image);
		}
		else
		{
			// 两个实数根
			double x1, x2;
			x1 = ( -b + sqrt(derta)) / (2 * a);
			x2 = ( -b - sqrt(derta)) / (2 * a);
			if(derta)
				printf("x1=%.4f,x2=%.4f\n", x1, x2);
			else
				printf("x1=x2=%.4f\n", x1);
		}
	}
	return 0;
}

❥(^_-)第二题 游戏时长


2.小毅喜欢玩游戏,她有一个习惯,在玩游戏的时候会统计自己一共玩了多少时长。时间采取24小时计时,游戏的时长不会超过一天,但是小毅可能在当晚23:00玩游戏玩到次日的1:30,此时时长一共2小时30分钟。游戏总时长不会超过24小时,请帮小毅统计玩游戏的时长。

输入格式:输入为一行,开始时间与结束时间之间使用空格分开。格式为:sh:sm eh:em
其中st:sm表示开始的小时和分钟,eh:em表示结束的小时和分钟。
输出格式:输出结果为a hours b minutes。表示a小时b分钟。

输入样例1:
8:30 10:00
输出样例1:
1 hours 30 minutes

输入样例2:
23:30 4:50
输出样例2:
5 hours 20 minutes

输入样例3:
23:59 23:58
输出样例3:
23 hours 59 minutes

输入样例4:
5:21 5:21
输出样例4:
0 hours 0 minutes


思路: 这道题我们可以采取前缀和的想法去做。我们可以把时间全部转化为分钟数来算,求出分钟差,最后再把分钟差转化为小时和分钟。对于本题有跨天的存在,所以当结束时间若是小于开始时间,我们可以将结束时间加上24小时的分钟数,转化为第二天的分钟数,如此就可以得出来游戏的分钟数。


代码:

#include 

int main()
{
	int sh, sm, eh, em;
	scanf("%d:%d %d:%d", &sh, &sm, &eh, &em);
	int st = sh * 60 + sm, et = 0;
	if(eh > sh || eh == sh && em >= sm) et = eh * 60 + em;
	else et = 24 * 60 + eh * 60 + em;  // 跨天的算法
	int duration_hours = (et - st) / 60;
	int duration_mins = (et - st) % 60;
	printf("%d hours %d minutes", duration_hours, duration_mins); 
	return 0;
}

你可能感兴趣的:(c语言,算法,数据结构)