社区讨论

AC感想

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

讨论操作

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

当前回复
5 条
当前快照
1 份
快照标识符
@m0i2fqhm
此快照首次捕获于
2024/08/31 19:34
2 年前
此快照最后确认于
2024/08/31 21:22
2 年前
查看原帖
没错还是我QWQ,你可以在下面的帖子找到我
两天了,终于A了,说一下我的感想
我的代码主体都是对的,就错在了输出较大的结果上QAQ
我在比较的时候用的是如下代码
CPP
			int fz=0-b+sqrt(d),fm=2*a;int k=abs(__gcd(fz,fm));fz/=k;fm/=k;
			int fzz=0-b-sqrt(d),fmm=2*a;k=abs(__gcd(fzz,fmm));fzz/=k;fmm/=k;
			long double  kk1=fzz/fmm,kk2=fz/fm;
			if(kk1>kk2){swap(fzz,fz);swap(fmm,fm);}
但是他有一个问题导致他无法正确比较,就是在计算的时候由于
CPP
fz
fm
fzz
fmm
都是整数,所以算出来也是整数终于在下载样例之后被我发现了,之后我就改成了这样:
CPP
			int fz=0-b+sqrt(d),fm=2*a;int k=abs(__gcd(fz,fm));fz/=k;fm/=k;
			int fzz=0-b-sqrt(d),fmm=2*a;k=abs(__gcd(fzz,fmm));fzz/=k;fmm/=k;
			long double  kk1=(double)fzz/fmm,kk2=(double)fz/fm;
			if(kk1>kk2){swap(fzz,fz);swap(fmm,fm);}
加了一个
CPP
(double)
然后。。。就A了;
对了,在这期间我还改了一个地方:在无理数的时候,
LATEX
q1+q2*sqrt(n)
这里一定是“+”,不会是“-”!!!
最后贴上我的醉人代码QWQ:
CPP
#include<bits/stdc++.h>
using namespace std;
bool cf(int n){int x=sqrt(n);return x*x==n;}
int fj(int n){for(int i=sqrt(n);i>=1;i--)if(n%(i*i)==0)return i;}
int t,m,a,b,c,d;
int main( ){
	cin>>t>>m;
	while(t--){
		cin>>a>>b>>c;
		d=b*b-4*a*c;
		if(d<0){cout<<"NO"<<endl;continue;}
		if(cf(d)){
			int fz=0-b+sqrt(d),fm=2*a;int k=abs(__gcd(fz,fm));fz/=k;fm/=k;
			int fzz=0-b-sqrt(d),fmm=2*a;k=abs(__gcd(fzz,fmm));fzz/=k;fmm/=k;
			long double  kk1=(double)fzz/fmm,kk2=(double)fz/fm;
			if(kk1>kk2){swap(fzz,fz);swap(fmm,fm);}
			if(fz==0){cout<<0<<endl;continue;}
			long double  kkk=(long double)fz/fm;fz=abs(fz);fm=abs(fm);
			if(kkk<0.0) cout<<'-';
			cout<<fz;
			if(fm!=1) cout<<'/'<<fm;
			cout<<endl;
		}else{
			int fz1=0-b,fm1=2*a,boo=0;int k1=abs(__gcd(fz1,fm1));fz1/=k1;fm1/=k1;
			string ans1,ans2;
			if(fz1==0){ans1="-1";boo=1;}
			if(boo==0){
				long double kkk=(double)fz1/fm1;fz1=abs(fz1);fm1=abs(fm1);
				if(kkk<0.0) cout<<'-';
				cout<<fz1;
				if(fm1!=1) cout<<'/'<<fm1;
			}
			if(d==0){cout<<endl;continue;}
			else if(boo==0) cout<<'+';
			int fz2=fj(d),fm2=2*a;d/=fz2;d/=fz2;int k2=abs(__gcd(fz2,fm2));fz2/=k2;fm2/=k2;fz2=abs(fz2);fm2=abs(fm2);
			if(fz2!=1)cout<<fz2<<'*';
			cout<<"sqrt("<<d<<")";
			if(fm2!=1) cout<<'/'<<fm2;
			cout<<endl;
		}
	}
}

回复

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

正在加载回复...