社区讨论

10pts

P9750[CSP-J 2023] 一元二次方程参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@m0f6ivti
此快照首次捕获于
2024/08/29 19:06
2 年前
此快照最后确认于
2024/08/29 21:55
2 年前
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std;
int t,m,a,b,c;
bool cf(int n){int y=sqrt(n);return n==y*y;}
int fj(int n){
	int ans=1;
	for(int i=sqrt(n);i>=1;i--){
		if(n%(i*i)==0){
			ans=i;
			break;
		}
	}
	return ans;
}
int main( ){
	
	cin>>t>>m;
	while(t--){
		cin>>a>>b>>c;
		int dert=b*b-4*a*c;
		if(dert<0){
			cout<<"NO"<<endl;
			continue;
		}
		if(cf(dert)){
			int fz=0-b+sqrt(dert),fm=2*a;
			int k=__gcd(fz,fm);
			fz/=k;
			fm/=k;
			if(fz<0||fm<0){
				if(fz<0&&fm<0){
					fz=abs(fz);
					fm=abs(fm);
					if(fm==1){
						cout<<fz<<endl;
					}
					else{
						printf("%d/%d",fz,fm);
						cout<<endl;
					}
				}
				else{
					fz=abs(fz);
					fm=abs(fm);
					if(fm==1){
						cout<<'-'<<fz<<endl;
					}
					else{
						printf("-%d/%d",fz,fm);
						cout<<endl;
					}
				}
			}
			else{
				if(fm==1){
					cout<<fz<<endl;
				}
				else{
					printf("%d/%d",fz,fm);
					cout<<endl;
				}
			}
		}
		else{
			//无理数dert=bb-4ac;
			
			int nc=b*b-4*a*c;
			int w=fj(nc);
			int nl=nc/(w*w);
			int fz=w,fm=2*a;
			int k=__gcd(fz,fm);
			fz/=k;
			fm/=k;
			int fz_q=0-b,fm_q=2*a;
			int k_q=__gcd(fz_q,fm_q);
			fz_q/=k_q;
			fm_q/=k_q;
			if(fz_q<0||fm_q<0){
				if(fz_q<0&&fm_q<0){
					fz_q=abs(fz_q);
					fm_q=abs(fm_q);
					if(fm_q==1){
						if(fz_q==0){
							goto g;
						}
						cout<<fz_q<<'+';
					}
					else{
						if(fz_q==0){
							goto g;
						}
						printf("%d/%d+",fz_q,fm_q);
					}
				}
				else{
					fz_q=abs(fz_q);
					fm_q=abs(fm_q);
					if(fm_q==1){
						if(fz_q==0){
							goto g;
						}
						cout<<'-'<<fz_q<<'+';
					}
					else{
						if(fz_q==0){
							goto g;
						}
						printf("-%d/%d+",fz_q,fm_q);
					}
				}
			}
			else{
				if(fm_q==1){
					if(fz_q==0){
						goto g;
					}
					cout<<fz<<'+';
				}
				else{
					if(fz_q==0){
						goto g;
					}
					printf("%d/%d+",fz_q,fm_q);
				}
			}
			
			//先输出前半部分,以下为后半段
			
			
			g:
			if(fz<0||fm<0){
				if(fz<0&&fm<0){
					fz=abs(fz);
					fm=abs(fm);
					if(fm==1){
						if(fz==1){
							printf("sqrt(%d)",nl);
							cout<<endl;
							continue;
						}
						printf("%d*sqrt(%d)",fz,nl);
						cout<<endl;
					}
					else{
						if(fz==1){
							printf("sqrt(%d)/%d",nl,fm);
							cout<<endl;
							continue;
						}
						printf("%d*sqrt(%d)/%d",fz,nl,fm);
						cout<<endl;
					}
				}
				else{
					fz=abs(fz);
					fm=abs(fm);
					if(fm==1){
						printf("-%d*sqrt(%d)",fz,nl);
						cout<<endl;
					}
					else{
						printf("-%d*sqrt(%d)/%d",fz,nl,fm);
						cout<<endl;
					}
				}
			}
			else{
				if(fm==1){
					if(fz==1){
						printf("sqrt(%d)",nl);
						cout<<endl;
						continue;
					}
					printf("%d*sqrt(%d)",fz,nl);
					cout<<endl;
				}
				else{
					if(fz==1){
						printf("sqrt(%d)/%d",nl,fm);
						cout<<endl;
						continue;
					}
					printf("%d*sqrt(%d)/%d",fz,nl,fm);
					cout<<endl;
				}
			}
			
			
		}
	}
	
}
RT,10pts求调

回复

0 条回复,欢迎继续交流。

正在加载回复...