一元二次方程 CSP-J 2023

这是一个连T1都没AC的蒟蒻.

纯纯的模拟题,按题目描述写代码即可,打的手酸死了,连我这个初二数学渣都会做一元二次方程了().

按题目描述,本文分为以下几部分:

输入 T T T M M M T T T代表数据数量,而 M M M没有啥用,几乎可以忽略,但是必须得输入.

每组数据输入 a 、 b 、 c a、b、c abc,代表方程的系数.


有理数的输出

题目中许多有理数应按格式输出,因此有一个输出模板会比较方便,为了下文代码简洁,这里便定义一个函数做模板. 函数有两个参数,分别代表分子p和分母q. 由于满足 q > 0 q > 0 q>0,分数又可以为负数,所以约分时需要将p进行绝对值判断. 约分过程较为简单,就是若最大公因数不为 0 0 0,将 p 、 q p、q pq分别除以最大公因数即可.

void rational(long long p,long long q)
{
   
	long long gcd=__gcd(abs(p),q);	//获取最大公因数
	
	while(gcd!=1)					//若两数未互质
	{
   
		p/=gcd;
		q/=gcd;
			
		gcd=__gcd(abs(p),q);		//不断获取最大公因数
	}
		
	printf("%lld",p);
	if(q!=1)						//若分母为1即为整数,不输出分母
		printf("/%lld",q);
	
	return;
}

无实数解

题目告诉我们:若 Δ = b 2 − 4 a c < 0 \Delta = b ^ 2 - 4ac < 0 Δ=b24ac<0,则表明方程无实数解,此时你应当输出 NO \text{NO} NO. 所以我们定义一个变量 D e l t a Delta Delta赋值为 Δ \Delta Δ (后面会有很多要用的). 若 D e l t a < 0 Delta<0 Delta<0 ,我们输出 NO \text{NO} NO,进入下一轮判断.

Delta=b*b-4*a*c;
if(Delta<0)
{
   
	printf("NO\n");
	continue;
}

有实数解

Δ ≥ 0 \Delta≥0 Δ0,此时方程有两解(可能相等),记其中较大者为 x x x.

x x x为有理数

判断整数 Δ \Delta Δ是否为有理数,即求 int( Δ \sqrt \Delta Δ ) 2 ^2 2是否等于 Δ \Delta Δ. 若相等则代表 Δ \Delta Δ为有理数.

根据公式 x = − b ± Δ 2 a = − b 2 a ± Δ 2 a x=\frac{-b \pm \sqrt \Delta}{2a}=\frac{-b}{2a} \pm \frac{\sqrt \Delta}{2a} x=2ab±Δ =2ab±2aΔ ,a、b为定值,即 − b 2 a \frac{-b}{2a} 2ab Δ 2 a \frac{\sqrt \Delta}{2a} 2aΔ 是定值,那么 x x x的值由符号 ± \pm ± 决定. 因为 Δ ≥ 0 \sqrt \Delta\ge0 Δ 0,所以我们可以知道当 a > 0 a>0 a>

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值