社区讨论

诸位大佬,蒟蒻CSP-JT3求调,急急急!!感激不尽

学术版参与者 2已保存回复 2

讨论操作

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

当前回复
2 条
当前快照
1 份
快照标识符
@loauat80
此快照首次捕获于
2023/10/29 10:16
2 年前
此快照最后确认于
2023/11/02 10:57
2 年前
查看原帖
C
#include<iostream>
#include<cmath>
using namespace std;
int T,M,a,b,c;

int gcd(int a,int b)
{
	if(b==0) return a;
	else return gcd(b,a%b);
}

void solve(int a,int b,int c)
{
	if(a==0)//题目没有描述a!=0,记得特殊判断,后面a会作为分母的 
	{
		cout<<"NO"<<endl;
		return ;
	}
	int dt=b*b-4*a*c;
	if(dt<0)//不存在解 
	{
		cout<<"NO"<<endl;
		return ;
	}
	if(dt==int(sqrt(dt))*int(sqrt(dt)))//验证完全平方根 
	{
		//能开平方说明存在分子为整数的解
		int q1,q2=2*a;//分子,分母
		if(a<0) q1=-b-sqrt(dt);//为了保证答案较大,sqrt(dt)必须和a同符号
		else q1=-b+sqrt(dt);
		int g=gcd(abs(q1),abs(q2));//约分
		if(q1%q2==0)//存在整数解 
		{
			cout<<q1/q2;
		}
		else//存在分数解 
		{
			if(q1>0 && q2>0 || q1<0 && q2<0)//注意符号
			{
				cout<<abs(q1)/g<<"/"<<abs(q2)/g;
			}
			else
			{
				cout<<"-"<<abs(q1)/g<<"/"<<abs(q2)/g;
			}
		}
		return ;
	}
	else//不能完全开平方根 
	{
		int q1=-b,q2=2*a,q3=dt;
		
		//(-b+sqrt(b^2-4ac))/2a = (q1+sqrt(q3))/q2;
		//接下来对q3进行提取完全平方数,转换成 (q1+q4*sqrt(q3))/q2的形式
		int q4=1; 
		for(int i=2;i*i<=q3;i++)
		{
			int x=i*i;
			while(q3%x==0)
			{
				q3/=x;
				q4*=i;
			}
		}
		//注意输出形式为 q1/q2+q4 sqrt(q3)/q2;
		//所以要分开约分
		int g1=gcd(abs(q1),abs(q2));
		//1.前半段 q1/q2 的输出
		bool flag=true;
		if(q1==0)
		{
			//特别注意q1为0,什么都不输出,但是他会影响到后半段的开头是否需要+号
			flag=false;//判断前半段是否为0 
		} 
		else if(q1%q2==0)//存在整数解 
		{
			cout<<q1/q2;	
		} 
		else//存在分数解 
		{
			if(q1>0 && q2>0 || q1<0 && q2<0)//注意符号
			{
				cout<<abs(q1)/g1<<"/"<<abs(q2)/g1;
			}
			else
			{
				cout<<"-"<<abs(q1)/g1<<"/"<<abs(q2)/g1;
			}
		}
		//2.后半段 q4/a2 的输出
		int g2=gcd(abs(q4),abs(q2));
		//输出格式为c*sqrt(q3),特别注意c是否为1,切正负数的正负一定和a是同符号的,这样才能保证是+,才能取得最大 
		if(flag==true) cout<<"+";//需要+
		if(q4%q2==0)//存在整数解 
		{
			int c=abs(q4)/q2;
			if(c==1) cout<<"sqrt("<<q3<<")";
			else cout<<c<<"*"<<"sqrt("<<q3<<")";
			return ; 
		} 
		else//存在分数解
		{
			int c=abs(q4)/g2;
			if(c==1)
			{
				cout<<"sqrt("<<q3<<")"<<"/"<<abs(q2)/g2;
			}	
			else
			{
				cout<<abs(c)<<"*"<<"sqrt("<<q3<<")"<<"/"<<abs(q2)/g2;
			}
			return ;
		} 
	}
}
int main()
{
	cin>>T>>M;
	for(int i=0;i<T;i++)
	{
		cin>>a>>b>>c;
		solve(a,b,c);
	}
	return 0;
} 
万分感谢各位大佬,样例能过,但是提交0分

回复

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

正在加载回复...