1 solutions
-
1
构式大模拟。
#include<iostream> #include<cmath> #include<algorithm> using namespace std; int t,m,a,b,c; inline void print(int son,int mom){ int ppp=__gcd(abs(mom),abs(son)); son/=ppp,mom/=ppp; if(mom<0) mom=-mom,son=-son; if(mom==1) cout<<son; else cout<<son<<"/"<<mom; return; } inline void solve(int a,int b,int c){ int delta=b*b-4*a*c; if(a<0) a=-a,b=-b,c=-c;//学过数学的都知道,负数/负数可以一并提出-号,结果是正数 所以先把负数处理掉,避免出现形如-7/-2的情况 if(delta<0){//判别式 cout<<"NO"<<endl; return; } else{//我管你一个解两个解,和我的公式说去吧 double x1=(-b+sqrt(delta))/2*a,x2=(-b-sqrt(delta))/2*a; double ans=(x1>x2?x1:x2);//较大解 int sqdel=sqrt(delta); if(sqdel*sqdel!=delta){//一个数开根后的整数部分的平方说明这个数不是完全平方数,sqdel是无理数,这很好理解 //下文的根据:(-b+(-)sqrt(delta))/2*a=-b/2*a+(-)sqrt(delta)/2*a if(b!=0){//如题,处理q1 int fson=-b; int fmom=2*a; print(fson,fmom); cout<<'+'; } for(int i=sqdel;i>=1;i--){//化简根号,从大到小可以包含更多因数,才是最简 if(delta%(i*i)==0){ int p=i,q=2*a;//化简!化简!化简!要化简! int ppp=__gcd(p,q); p/=ppp; q/=ppp; //针对为1的系数不用输出做处理 if(p==q) cout<<"sqrt("<<delta/(i*i)<<")"<<endl;//等同于p==1&&q==1 else if(p==1) cout<<"sqrt("<<delta/(i*i)<<")/"<<q<<endl; else if(q==1) cout<<p<<'*'<<"sqrt("<<delta/(i*i)<<")"<<endl; else cout<<p<<"*"<<"sqrt("<<delta/(i*i)<<")/"<<q<<endl; return; } } } else{//sqdel是整数,delta是完全平方数 int fson=-b+sqdel; int fmom=2*a; print(fson,fmom); cout<<endl; return; } } } signed main(){ cin>>t>>m; while(t--){ cin>>a>>b>>c; solve(a,b,c); } return 0; } //凑65用的
- 1
Information
- ID
- 9091
- Time
- 1000ms
- Memory
- 512MiB
- Difficulty
- 3
- Tags
- # Submissions
- 72
- Accepted
- 13
- Uploaded By