CSP-J T3爆0求调
查看原帖
CSP-J T3爆0求调
680022
Rice_Demon_King楼主2023/10/30 23:11

代码如下(本蒟蒻第一次参加复赛,代码较丑勿喷)

#include<bits/stdc++.h>
using namespace std;
int t,m,a,b,c,tong[100001],f1,q1=1,delta1;
int pd(int d){					//判断质数 
	if(d<2) return 0;
	if(d==2) return 1;
	for(int i=2;i<=sqrt(d);i++){
		if(d%i==0) return 0;
	}
	return 1;
}
void huajian(){				//化简根式
	if(f1==1) return ;
	if(delta1==1){
		f1=1;
		return ;
	} 
	if(pd(delta1)==1){
		if(tong[delta1]==1) q1=q1*delta1;
		f1=1;
		return ;
	}
	for(int i=2;i<=sqrt(delta1);i++){			//查询是在该数中否有两个质数因数 (如18中有2个3) 
		if(delta1%i==0&&pd(i)==1){
			tong[i]++;
			delta1=delta1/i;
			if(tong[i]==2){
				q1=q1*i;
				tong[i]=0;
			}
			huajian();
		}
	}
	return ;
}
void cout1(int flag,int zi,int mu){				//有理数输出 
	if(flag==1) cout<<"-";
	cout<<zi;
	if(mu!=1) cout<<"/"<<mu;
}
void cout2(int zi,int mu,int delta){		//无理数输出 
	cout<<zi<<"*sqrt("<<delta<<")/"<<mu<<endl;
}
void fenshu(int zi,int mu,int cyh,int delta){	//分子,分母,是否为有理数 ,无理数根号下的值(专门给cout2函数的) 
	int flag;
	if(zi<0&&mu>0){
		flag=1;
		zi=-zi;
	}
	if(zi>0&&mu<0){
		flag=1;
		mu=-mu;
	} 
	if(zi<0&&mu<0){
		zi=-zi;
		mu=-mu;
	}
	int f[100001],tmp=1;
	for(int i=2;i<=zi;i++){				//找质数因数 
		if(zi%i==0&&pd(i)==1){
			f[tmp]=i;
			tmp++;
		}
	}
	if(zi==2){
		f[tmp]=2;
		tmp++;
	}
	for(int i=1;i<tmp;i++){				//约分 
		if(mu%f[i]==0&&zi%f[i]==0){
			mu=mu/f[i];
			zi=zi/f[i];
			i--;
			continue;
		}
	}
	if(cyh==0) cout1(flag,zi,mu);	//有理数输出 
	else cout2(zi,mu,delta);		//无理数输出 
}
int main(){
	//freopen("uqe.in","r",stdin);
	//freopen("uqe.out","w",stdout);
	cin>>t>>m;
	while(t--){
		memset(tong,0,sizeof(tong));	//数组清0 
		q1=1;
		f1=0;
		cin>>a>>b>>c;
		int delta=b*b-4*a*c;			//判别式 
		if(delta<0){					//无解 
			cout<<"NO"<<endl;
			continue;
		}
		int t=sqrt(delta);
		if(t*t==delta){					//解为有理数 
			if(a>0){					//a>0:分母越大值越大 
				fenshu(-b+t,2*a,0,0);
				cout<<endl;	
			} 
			else{						//a<0:分母越小值越大 
				fenshu(-b-t,2*a,0,0);
				cout<<endl;	
			}
		}
		else{							//解为无理数 
			if(b!=0){					//输出根式的有理数部分 
				fenshu(-b,2*a,0,0);
				cout<<"+";
			}
			delta1=delta;				
			huajian();				//化简delta1,求出delta里能提取出的最大平方数的算术平方根(如18中最大数是3) 
			delta=(delta/q1)/q1;	//化简delta 
			if(q1==abs(2*a)) cout<<"sqrt("<<delta<<")"<<endl;			//根式系数为1 
			else if(q1%abs(2*a)==0) cout<<q1/abs(2*a)<<"*"<<"sqrt("<<delta<<")"<<endl;	//根式系数为整数 
			else if(abs(2*a)%q1==0) cout<<"sqrt("<<delta<<")/"<<abs(2*a)/q1<<endl;	//根式系数的倒数为整数(如1/18) 
			else fenshu(q1,abs(2*a),1,delta);
		}
	}
	return 0;
}

跪求各位大佬帮忙调代码!

2023/10/30 23:11
加载中...