一元二次方程的解析

首先粗略的看一下题目

#include <bits/stdc++.h>
using namespace std;
int t,M,m,n;
long long sum;
void ch2(int rt)
{
//用穷举法找因数之中最大的一个完全平方数 

	m=1,n=rt;
	sum=2;
	for(;rt>1&&rt>=sum*sum;)
	{
		while(rt%(sum*sum)==0)
		{
			m *=sum;
			rt/=sum*sum;
			n/=sum*sum;
		}
		if(rt%sum==0)
		{
			rt/=sum;
			sum--;	
		}
		sum++;
	}
}

void ch(int a,int b,int c,int rt){
	int d=a*2;
	//计算分母 
	int rt1=sqrt(rt);
	//√▲ 如果是整数 
	bool fl=a>0?1:0;
	//标记判断a的正负性 
	
	if(rt==rt1*rt1)
	{//√▲ 若是一个整数,则式子形为整数或者分数形式 
		int u=fl?(-b)+rt1: (-b)-rt1;
		//求出分子 
		int mo= __gcd(abs(u),abs(d));
		//分子分母一起约分 
		u/=mo,d/=mo;
		if(u*d<0)
		{
			printf("-");
			//若结果为负数 
		}
		
		u=abs(u);
		d=abs(d);
		if(u%d==0)//d是u的因数 
		{
			printf("%d\n",u/d);
			//结果为整数 
		}
		
		else
		{
			printf("%d/%d\n",u,d);
			//结果为分数 	
		}
		

	}
	else
	{
	//√▲不是一个整数
 //可能情况为 b*sqrt(c)或a+b*sqrt(c)
 
		ch2(rt);
		//计算根号的系数 
		int u1=(-b);
		int d1=2*a;
		//前半部分 
		int u2=fl?m: (-m);
		int d2=2*a;
		//后半部分 
		int mo1=__gcd(abs(u1),abs(d1));
		int mo2=__gcd(abs(u2),abs(d2));
		u1/=mo1,d1/=mo1;
		if(u1*d1<0)
		{
			printf("-");
		}
		d1=abs(d1);
		u1=abs(u1);
		
		if(u1)
		{
		//特判分子等于 0的情况 ,分子不等于0才要输出前半部分 
			if(u1%d1==0)
			{
				printf("%d+",u1);
			}
			else
			{
				printf("%d/%d+",u1,d1);
			}
		}
		u2/=mo2,d2/=mo2;
		if(u2*d2<0)
		{
			printf("-");
		}
	 
		u2=abs(u2),d2=abs(d2);
		if(d2==1)
		{//分子大于分母,且分子分母不互质 
			if(u2==1)
			{
				printf("sqrt(%d)\n",n);
			}
			//比如 a+sqrt(c)
			else
			{
				printf("%d*sqrt(%d)\n",u2,n);
			}//比如a+b*sqrt(c)
	
		}
		else if(u2==1)
		{
		// int mod3 = gcd(abs(u2), abs(d2));
			printf("sqrt(%d)/%d\n",n,d2);
			
		}
		else
		{
			printf("%d*sqrt(%d)/%d\n",u2,n,d2);
		}
	}
	return ;
}
signed main(){
	scanf("%d%d",&t,&M);
	while(t--)
	{
		int a, b, c;
		scanf("%d%d%d",&a,&b,&c);
		int rt=b*b-4*a*c;
		//计算根的判别 
		if(rt<0)
		{
			printf("NO\n");
		}
		else
		{
			ch(a,b,c,rt);
		}
	}
	return 0;
}

可过。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值