爆0求调
查看原帖
爆0求调
877691
MorLeaves楼主2024/2/25 20:06

大样例看了好多个全部过了,但爆0。

#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
double a,b,c;
bool check(double x)
{
	double y=floor(sqrt(x));
	return y*y==x;
}
int gcd(int a,int b)
{
	return a%b==0?b:gcd(b,a%b);
}
int work(int p)
{
	int t=1,ans;
	while(t*t<=p)
	{
		if (p%(t*t)==0)
		{
			ans=t;
		}
		t++;
	}
	return ans;
}
int main()
{
//	freopen("uqe2.in","r",stdin);
//	freopen("uqe2.out","w",stdout); 
	int T,M;
	scanf("%d %d",&T,&M);
	for(int ypy=1;ypy<=T;ypy++)
	{
		scanf("%lf %lf %lf",&a,&b,&c);
		double p=b*b-4*a*c,ans;
		if (p<0)
		{
			printf("NO\n");
			continue;
		}
		if (check(p))
		{
			ans=max((-b+sqrt(p))/(2*a),(-b-sqrt(p))/(2*a));
			if (floor(ans)==ans)
			{
				printf("%.0lf\n",ans);
			}
			else
			{
				int n=-b+sqrt(p),m=2*a;
				if (n<0)
				{
					n=-n;
					printf("-");
				}
				int k=gcd(n,m);
				n/=k,m/=k;
				printf("%d/%d\n",n,m);
			}
		}
		else
		{
			int u=-b,v=2*a;
			if ((u<0)+(v<0)==1&&u!=0)
			{
				printf("-");
				u=abs(u);
				v=abs(v);
			}
			if (u!=0)
			{
				if (u%v==0)
				{
					printf("%d+",u/v);
				}
				else
				{
					int k=gcd(u,v);
					u/=k,v/=k;
					printf("%d/%d+",u,v);
				}
			}
			a=abs(a);
			int pp=p;
			int t=work(pp),x=1,y=2*a;
			pp/=(t*t);
			x*=t;
			int k=gcd(x,y);
			x/=k,y/=k;
//			printf("%d\n",x);
			if (x!=1)
			{
				printf("%d*",x);
			}
			printf("sqrt(%d)",pp);
			if (y!=1)
			{
				printf("/%d",y);
			}
			printf("\n");
		}
	}
	return 0;
}

提交记录

2024/2/25 20:06
加载中...