P9750一元二次方程 玄关!求求帮忙
  • 板块灌水区
  • 楼主303grace
  • 当前回复8
  • 已保存回复8
  • 发布时间2024/7/22 17:59
  • 上次更新2024/7/22 19:33:50
查看原帖
P9750一元二次方程 玄关!求求帮忙
1328954
303grace楼主2024/7/22 17:59

题目描述 现在给定一个一元二次方程的系数 ? , ? , ? a,b,c,其中 ? , ? , ? a,b,c 均为整数且 ? ≠ 0 a  =0。你需要判断一元二次方程 ? ? 2 + ? ? + ? 是否有实数解,并按要求的格式输出。

在本题中输出有理数 ? v 时须遵循以下规则:

由有理数的定义,存在唯一的两个整数 ? p 和 ? q,满足 ?

0 q>0, gcd ⁡ ( ? , ? ) 1 gcd(p,q)=1 且 ? ? ? v= q p 。 若 ? 1 q=1,则输出 {p},否则输出 {p}/{q},其中 {n} 代表整数 ? n 的值;

例如:

当 ? − 0.5 v=−0.5 时, ? p 和 ? q 的值分别为 − 1 −1 和 2 2,则应输出 -1/2; 当 ? 0 v=0 时, ? p 和 ? q 的值分别为 0 0 和 1 1,则应输出 0。 对于方程的求解,分两种情况讨论:

若 Δ ? 2 − 4 ? ? < 0 Δ=b 2 −4ac<0,则表明方程无实数解,此时你应当输出 NO;

否则 Δ ≥ 0 Δ≥0,此时方程有两解(可能相等),记其中较大者为 ? x,则:

若 ? x 为有理数,则按有理数的格式输出 ? x。

否则根据上文公式, ? x 可以被唯一表示为 ? ? 1 + ? 2 ? x=q 1 ​ +q 2 ​

r ​ 的形式,其中:

? 1 , ? 2 q 1 ​ ,q 2 ​ 为有理数,且 ? 2

0 q 2 ​

0; ? r 为正整数且 ?

1 r>1,且不存在正整数 ?

1 d>1 使 ? 2 ∣ ? d 2 ∣r(即 ? r 不应是 ? 2 d 2 的倍数); 此时:

若 ? 1 ≠ 0 q 1 ​

 =0,则按有理数的格式输出 ? 1 q 1 ​ ,并再输出一个加号 +; 否则跳过这一步输出; 随后:

若 ? 2 1 q 2 ​ =1,则输出 sqrt({r}); 否则若 ? 2 q 2 ​ 为整数,则输出 {q2}*sqrt({r}); 否则若 ? 3

1 ? 2 q 3 ​

q 2 ​

1 ​ 为整数,则输出 sqrt({r})/{q3}; 否则可以证明存在唯一整数 ? , ? c,d 满足 ? , ?

1 , gcd ⁡ ( ? , ? ) 1 c,d>1,gcd(c,d)=1 且 ? 2 ? ? q 2 d c ,此时输出 {c}*sqrt({r})/{d}; 上述表示中 {n} 代表整数 {n} 的值,详见样例。

如果方程有实数解,则按要求的格式输出两个实数解中的较大者。否则若方程没有实数解,则输出 NO。

输入格式 输入的第一行包含两个正整数 ? , ? T,M,分别表示方程数和系数的绝对值上限。

接下来 ? T 行,每行包含三个整数 ? , ? , ? a,b,c。 我的代码

#include<bits/stdc++.h> 
using namespace std;
int T,m,a,b,c,d,k,t;
int gcd(int a,int b){
	return b?gcd(b,a%b):a;}
void Main(){
	cin>>a>>b>>c;
	if(a<0)
		a=-a,b=-b,c=-c;
	d=b*b-4*a*c,k=1;
	if(d<0){
		cout<<"NO\n";
		return;}
	for(int i=2;i*i<=d;i++)
		while(d%(i*i)==0)
			k*=i,d/=(i*i);
	if(d==0||d==1){
		t=abs(gcd(2*a,-b+k*d));
		cout<<(-b+k*d)/t;
		if(2*a/t!=1)
			cout<<'/'<<2*a/t;
		cout<<'\n';
		return;}
	t=abs(gcd(-b,2*a));
	if(-b/t==0)
		goto g;
	cout<<-b/t;
	if(2*a/t!=1
		cout<<'/'<<2*a/t;
	cout<<'+';
	t=abs(gcd(k,2*a));
	if(k/t!=1)
		cout<<k/t<<'*';
	cout<<"sqrt("<<d<<')';
	if(2*a/t!=1)
		cout<<'/'<<2*a/t;
	cout<<'\n';
	return;}
int main(){
	for(cin>>T>>m;T;--T)
		Main();
	return 0;}

怎么全WA了?

2024/7/22 17:59
加载中...