![洛谷P9750 [CSP-J 2023] 一元二次方程一題的題解](http://pic.xiahunao.cn/yaotu/洛谷P9750 [CSP-J 2023] 一元二次方程一題的題解)
這是一道既簡單又復雜的模擬題我們需要進行分類討論再按題目要求處理。首先照著公式對b取反再用一個變量存分母2a然后求▲delta如果▲小于0就輸出NO 反之就輸出其較大的解的正確格式。求解時有兩個重要的任務第一約分第二處理無理數(shù)。約分很好辦用庫函數(shù)找到分子和分母的最大公約數(shù)就行處理無理數(shù)也還好找到根號里數(shù)最大的可開方的約數(shù)把它提出來再和分母進行約分。但是有一些細節(jié)約分時要記得管正負號如果分母為一就只用輸出分子分子為零不用輸出。還有有理數(shù)和無理數(shù)中間要加符號。#includebits/stdc.husingnamespacestd;pairint,intgh(intd){intx0,y0;for(inti1;i*id;i){if(d%(i*i)0){xi;yd/(i*i);}}return{x,y};}voidfs(intp,intq){if(p0){cout0;return;}if(q0){q-q;p-p;}intg__gcd(abs(p),q);p/g;q/g;if(q1)coutp;elsecoutp/q;}voidgen(intdelta,intden){pairint,intcgh(delta);intcsc.first;intg__gcd(cs,abs(den));cs/g;den/g;if(cs1)coutsqrt(c.second);elsecoutcs*sqrt(c.second);if(abs(den)!1)cout/abs(den);coutendl;}voidprint1(intp,intq){fs(p,q);coutendl;}voidprint2(intp,intq){if(p0)return;fs(p,q);cout;}intmain(){intt,m;cintm;while(t--){inta,b,c;cinabc;b-b;intden2*a;intdeltab*b-4*a*c;booltp(den0);if(delta0)coutNOendl;elseif(delta0)print1(b,den);else{intsq(int)round(sqrt(delta));if(sq*sqdelta){intsum;sumb(tp?sq:-sq);print1(sum,den);}else{print2(b,den);//前半部分gen(delta,den);//后半部分}}}return0;}