1 条题解

  • 1
    @ 2026-10-6 9:17:37

    我写了1万个if

    1.‘-’的判断方法:因为后面的根号部分和前面的分数部分分开输出,所以分别考虑前后两项:(1)前面的分数项:用a/b(分母的2*a中的2不影响直接不看,如果-b/2a要是负号,a/b必须>0,但是为了防止int导致a/b=0,如a=1,b=2,所以反过来b/a>0就可以避免) 但如果-b/2a是‘+’号则省略,不输出。 (2)根号项:很容易发现根号完的数前面可以是+也可以是-,不管分母是>0还是<0,符号都可以自选,又要输出最大解,所以前面的符号一定为‘+’不用判断。 (3)符号已经判断好,就不用管后面的符号,所以直接分子分母全用绝对值abs(a);

    #include<bits/stdc++.h>
    using namespace std;
    int t,m,a,b,c,dt,gys=1,xs=1,adt;
    int ghhj(int sz) {//从输入数字的开方到1算
    	for(int i=int(sqrt(sz));i>=2;i--) {
    		if(sz/(i*i)*(i*i)==sz) {//判断是否能整除i的平方,也可以防止数字直接为平方数
    			xs*=i;//系数初始值是1,系数*1
    			sz/=i*i;//根号下的数/i^2
    		}
    	}
    	if(sz==1) return 0;//意义不大,看的舒服
    	return sz;//返回根号下的数字,如果是1就代表根号开完了
    }//这里还有一个要注意的,顺序不能错,必须从大到小,例子为32,如果从小到大先是2的平方除完后8没的除了会导致结果为2*sqrt(8)
    int main(){
    	//freopen("b.in","r",stdin);
    	//freopen("1.out","w",stdout);
    	cin>>t>>m;//题目里面告的T和M(M其实没用但是不输入就会让后面的输入出错)
    	for(int i=0;i<t;i++) {
    		xs=1;
    		cin>>a>>b>>c;//二次,一次,常数项
    		dt=b*b-4*a*c;//b^2-4*a*c
    		if(dt<0) {
    			cout<<"NO"<<endl;//结果小于0,没有实数根直接NO
    			continue;//直接跳到下一个输入
    		}//下一行的解释:结果为0,只需要管-b/2a,答案很好写,但要注意化简。
    		else if(dt==0){
    			gys=__gcd(-b,2*a);//__gcd(a,b)找a,b的最大公因数直接除就能化成最简
    			if(2*a/gys==1) cout<<-b/gys;//分母为1,没分母,不输出分母,b=0则输出0,不会出错
    			else {
    				if(b!=0&&(b/a>0||a/b>0))cout<<'-';//用来判断前面的符号(判断方法看外面)
    				cout<<abs(-b/gys)<<'/'<<abs(2*a/gys);//这里b不能等于0否则会有0/a,
    			}
    		}
    		else {//这里是结果>0的情况
    			xs=1;
    			adt=ghhj(dt);//用函数化简分数(看上面的函数)
    			if(adt==0){//等于0就说明是整数直接和-b合并
    				if(a<0) b=-(-b-xs);
    			    else b=-(-b+xs);//举个例子自己算一下就懂了b=-11,xs=11,a=-1,算一下两个根
    			}
    			gys=__gcd(-b,2*a);
    			if(b!=0&&(b/a>0||a/b>0))cout<<'-';
    			if(b!=0) cout<<abs(-b/gys);
    			if(abs(2*a/gys)!=1&&b!=0) cout<<'/'<<abs(2*a/gys);//分母的判断
    			if(adt!=0) {
    				int gs=__gcd(xs,2*a);//系数分母的判断
    				if(b!=0) cout<<'+';//因为是根号的一项前面必须有符号所以输出+
    				if(abs(xs/gs)!=1) cout<<abs(xs/gs)<<'*';//系数为1就省略,不然就输出
    				cout<<"sqrt("<<adt<<")";
    				if(abs(2*a/gs)!=1)cout<<'/'<<abs(2*a/gs);//分母是否为1以及输出的判断
    			}
    			if(b==0&&adt==0) cout<<0;//防止输出空项,补个0
    		}
    		cout<<endl;//换行
    	}
    	return 0;
    }
    
    • 1

    信息

    ID
    93
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    92
    已通过
    3
    上传者