题目解析
这道题对于学生来说很无语:什么时候接一个方程都那么复杂了?
给定整数系数a,b,c(a!=0)的一元二次方程ax^2+bx+c=0,判别式小于 0 输出NO。判别式大于等于 0 时输出两个实根中较大根,严格按照题目有理数、根式化简格式输出。
思路拆分
- 先计算判别式delta = b^2-4ac,如果delta<0直接输出 NO;如果delta=0只有重根,按最简分数输出。
- delta>0,如果delta是完全平方数,根是有理数,取较大根约分后按分数格式输出。
- delta不是完全平方数,把根拆成q1+q2\sqrt®,对根号内部做平方因子化简,再按复杂根式输出规则格式化打印。
AC代码
#include<bits/stdc++.h>usingnamespacestd;usingll=longlong;//输出最简分数 p/q,保证分母>0voidfs(ll p,ll q){if(p==0){cout<<"0";return;}if(q<0){q=-q;p=-p;}ll g=__gcd(abs(p),abs(q));p/=g;q/=g;if(q==1)cout<<p;elsecout<<p<<"/"<<q;}//对n,分解出最大平方因子,返回 {k , r} n = k*k * r,r无平方因子pair<ll,ll>gh(ll n){ll k=1;for(ll i=2;i*i<=n;i++){while(n%(i*i)==0){k*=i;n/=i*i;}}return{k,n};}//输出 q2*sqrt(r) 这一部分,q2 = k / denvoidgen(ll k,ll r,ll den){// q2 = k / denll g=__gcd(k,abs(den));ll c=k/g;ll d=abs(den)/g;if(c==1){if(d==1)cout<<"sqrt("<<r<<")";elsecout<<"sqrt("<<r<<")/"<<d;}else{if(d==1)cout<<c<<"*sqrt("<<r<<")";elsecout<<c<<"*sqrt("<<r<<")/"<<d;}}intmain(){ios::sync_with_stdio(false);cin.tie(nullptr);intt,m;cin>>t>>m;while(t--){ll a,b,c;cin>>a>>b>>c;ll delta=b*b-4*a*c;if(delta<0){cout<<"NO\n";continue;}ll numer_q1=-b;ll den=2*a;if(delta==0){fs(numer_q1,den);cout<<"\n";continue;}ll sq=sqrtl(delta);if(sq*sq==delta){//有理数根 (-b + sqrtΔ) / (2a)fs(numer_q1+sq,den);cout<<"\n";}else{//拆 q1 + q2√r// q1 = (-b)/(2a)// q2√r = sqrtΔ/(2a) = k*sqrt(r)/denauto[k,r]=gh(delta);if(numer_q1!=0){fs(numer_q1,den);cout<<"+";}gen(k,r,den);cout<<"\n";}}return0;}