1 solutions

  • 1
    @ 2025-7-10 21:01:43

    构式大模拟。

    #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