资讯动态

CSP-J 2023一元二次方程 题解

发布时间:2026/8/19 12:50:01 来源:尧图企业网站定制
题目解析这道题对于学生来说很无语什么时候接一个方程都那么复杂了给定整数系数a,b,c(a!0)的一元二次方程ax^2bxc0判别式小于 0 输出NO。判别式大于等于 0 时输出两个实根中较大根严格按照题目有理数、根式化简格式输出。思路拆分先计算判别式delta b^2-4ac,如果delta0直接输出 NO如果delta0只有重根按最简分数输出。delta0如果delta是完全平方数根是有理数取较大根约分后按分数格式输出。delta不是完全平方数把根拆成q1q2\sqrt®对根号内部做平方因子化简再按复杂根式输出规则格式化打印。AC代码#includebits/stdc.husingnamespacestd;usinglllonglong;//输出最简分数 p/q保证分母0voidfs(ll p,ll q){if(p0){cout0;return;}if(q0){q-q;p-p;}ll g__gcd(abs(p),abs(q));p/g;q/g;if(q1)coutp;elsecoutp/q;}//对n分解出最大平方因子返回 {k , r} n k*k * rr无平方因子pairll,llgh(ll n){ll k1;for(ll i2;i*in;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 ck/g;ll dabs(den)/g;if(c1){if(d1)coutsqrt(r);elsecoutsqrt(r)/d;}else{if(d1)coutc*sqrt(r);elsecoutc*sqrt(r)/d;}}intmain(){ios::sync_with_stdio(false);cin.tie(nullptr);intt,m;cintm;while(t--){ll a,b,c;cinabc;ll deltab*b-4*a*c;if(delta0){coutNO\n;continue;}ll numer_q1-b;ll den2*a;if(delta0){fs(numer_q1,den);cout\n;continue;}ll sqsqrtl(delta);if(sq*sqdelta){//有理数根 (-b sqrtΔ) / (2a)fs(numer_q1sq,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;}

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价