1 条题解

  • 1

    首先,输入中的M没有任何用,可以直接%*d跳过

    然后分类讨论,先讨论Δ,Δ<0直接输出NO

    接下来讨论Δ是否为完全平方数,如果是完全平方数那么解就是一个有理数,直接输出

    最后讨论无理解,b为0时则为sqrt(Δ)/a,非零则直接暴力输出

    下面是代码

    #include <bits/stdc++.h>
    using namespace std;
    void print(int fz,int fm){//输出一个有理数
    	int g=abs(__gcd(fz, fm));//不想写gcd直接用__gcd
    	fz/=g,fm/=g;
    	if(fm==1) printf("%d",fz);
    	else printf("%d/%d",fz,fm);
    }
    int main(){
    	freopen("uqe.in","r",stdin);
    	freopen("uqe.out","w",stdout);
    	int t;
    	scanf("%d%*d",&t);//%*d表示空一个不读取
    	while(t--){
    		int a,b,c;
    		cin>>a>>b>>c;
    		int delta=b*b-4*a*c;//Δ
    		if(delta<0) cout<<"NO";//Δ<0
    		else{
    			int x=0;
    			for(int i=1;i*i<=delta;i++) if(delta%(i*i)==0) x=i;//判断Δ是否为完全平方
    			if(x*x==delta){
    				int fz,fm;
    				if(a>0) fz=-b+x,fm=2*a;
    				else fz=b+x,fm=-2*a;
    				print(fz,fm);
    			}
    			else{
    				int fz,fm;
    				if(a>0) fz=-b,fm=2*a;
    				else fz=b,fm=-2*a;
    				if(fz!=0){
    					print(fz, fm);
    					cout<<"+";
    				}//先输出前一个分数
    				int r=delta/(x*x);
    				if(a>0) fz=x,fm=2*a;
    				else fz=x,fm=-2*a;
    				int g=__gcd(fz,fm);
    				fz/=g,fm/=g;
    				if(fm==1){
    					if(fz==1) printf("sqrt(%d)",r);
    					else printf("%d*sqrt(%d)",fz,r);
    				} 
    				else if(fz==1) printf("sqrt(%d)/%d",r,fm);
    				else printf("%d*sqrt(%d)/%d",fz,r,fm);//上面一堆都是暴力输出
    			}
    		}
    		cout<<endl;//别忘换行
    	}
    	return 0;
    }
    

    信息

    ID
    225
    时间
    1000ms
    内存
    512MiB
    难度
    10
    标签
    递交数
    2
    已通过
    1
    上传者