为什么只能得60pts%%%%%
查看原帖
为什么只能得60pts%%%%%
757085
wangtengyun楼主2024/10/22 19:20
#include <iostream>
#include <cmath>
using namespace std;
int T,M;
int gcd(int a,int b){
    return b==0?a:gcd(b,a%b);
}
void f(int delta,int &integer,int &sqt){
    for(int i=sqrt(delta);i>=1;i--){
        if(delta%(i*i)==0){
            integer=i,sqt=delta/(i*i);
            return;
        }
    }
}
int main(){
    ios::sync_with_stdio(false);
    cin>>T>>M;
	while(T--){
		int a,b,c;
		cin>>a>>b>>c;
		double delta=b*b-4*a*c;
		if(delta<0){
		    cout<<"NO"<<endl;
		    continue;
		}
		double x1=(-b+sqrt(delta))/(2*a);
		double x2=(-b-sqrt(delta))/(2*a);
		if(sqrt(delta)==floor(sqrt(delta))){//是有理数
		    if(x1>=x2){
		        if(x1<0)cout<<"-";
		        cout<<abs((-b+sqrt(delta))/gcd(-b+sqrt(delta),2*a));
		        if(abs(2*a/gcd(-b+sqrt(delta),2*a))!=1)cout<<"/"<<abs(2*a/gcd(-b+sqrt(delta),2*a));
		    }else{
		        if(x2<0)cout<<"-";
		        cout<<abs((-b-sqrt(delta))/gcd(-b-sqrt(delta),2*a));
		        if(abs(2*a/gcd(-b-sqrt(delta),2*a))!=1)cout<<"/"<<abs(2*a/gcd(-b-sqrt(delta),2*a));
		    }
		    cout<<endl;
		}else{
		    double q1;
			int q2,r;
		    q1=1.0*(-b)/(2*a);
//			cout<<(-b)<<" "<<2*a<<" "<<q1<<" ";
	        if(q1!=0){
//				cout<<"(flag)";
	            if(q1<0)cout<<"-";
				if(abs(2*a/gcd(-b,2*a))==1)cout<<abs(1.0*(-b/gcd(-b,2*a)))<<"+";
	            else cout<<abs(1.0*(-b/gcd(-b,2*a)))<<"/"<<abs(2*a/gcd(-b,2*a))<<"+";
	        }
	        f(delta,q2,r);//化简delta
			if(1.0*q2/(2*a)==1){
			    cout<<"sqrt("<<r<<")"<<endl;
			}else if(1.0*q2/(2*a)==q2/(2*a)){
			    cout<<abs(q2/(2*a))<<"*sqrt("<<r<<")"<<endl;
			}else{
			    if(abs(q2/gcd(q2,2*a))==1)cout<<"sqrt("<<r<<")/"<<abs(2*a/gcd(q2,2*a))<<endl;
			    else cout<<abs(q2/gcd(q2,2*a))<<"*sqrt("<<r<<")/"<<abs(2*a/gcd(q2,2*a))<<endl;
			}
//			cout<<q2/(2*a)<<" "<<r<<endl;
		}
	}
	
    return 0;
}
2024/10/22 19:20
加载中...