60pts-RE(FPE)
查看原帖
60pts-RE(FPE)
963648
AidenWang楼主2024/10/11 22:34

各位大佬,帮个忙吧

AC6+RE4(Signal 8: Floating Point Exception)

当前设想:sqrt(negative)

C++代码(非常乱,请见谅……)

#include <iostream>
#include <algorithm>
#include <cmath>
#include <vector>
#include <utility>
#define can_div(a,b) ((a)/(b)==(double)(a)/(b))
#define cor_zero(val) (val==(-0)||val==(0)?0:val)
#define is_square_num(val) ((int)(sqrt(val))*(int)(sqrt(val))==val)
using namespace std;
int t,m,a,b,c;
//bool is_square[10000005];
/*void init_squares(int mmm)
{
	is_square[0]=1;
	for(int i = 1;i <= mmm;i ++) is_square[i*i]=1;
}*/
pair<int,int> simplify_sqrt(int val)
{
	if(val==0||val==1) return make_pair(1,val);
//	cout << "simplify: " << val << endl;
	int cur1=1,cur2=val;
	for(int i = 2;i <= sqrt(val);i --)
	{
		if(cur2%i) continue;
//		cout << " | trying: " << i << ", is_square[i]==" << is_square[i] << endl;
		cur2 /= (i*i);
		cur1 *= i;
	}
	return make_pair(cur1,cur2);
}
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0); cout.tie(0);
	cin >> t >> m;
	while(t--)
	{
		cin >> a >> b >> c;
		int delta = b*b-4*a*c;
//		cout << simplify_sqrt(delta).first << ' ' << simplify_sqrt(delta).second
//		<< '\n';
		if(delta<0){cout << "NO\n"; continue;}
		if(delta==0)
		{
			if(b==0) cout << "0\n";
			else if(can_div(b,2*a)) cout << (0-b)/(2*a) << '\n';
			else{int ds1=0-b,ds2=2*a;
			if(ds1>=0&&ds2<0) ds1=(0-ds1),ds2=(0-ds2);
			else if(ds1<0&&ds2<0) ds1=(0-ds1),ds2=(0-ds2);
			cout << (ds1)/abs(__gcd(abs(ds1),abs(ds2))) << '/'
			<< (ds2)/abs(__gcd(abs(ds1),abs(ds2))) << '\n';}
			continue;
		}
		else
		{
			if(!is_square_num(delta))
			{
				pair<int,int> del_c = simplify_sqrt(delta);
				if(b!=0)
				{
					if(can_div(b,2*a)) cout << (0-b)/(2*a) << '+';
					else{int ds1=0-b,ds2=2*a;
					if(ds1>=0&&ds2<0) ds1=(0-ds1),ds2=(0-ds2);
					else if(ds1<0&&ds2<0) ds1=(0-ds1),ds2=(0-ds2);
					cout << (ds1)/abs(__gcd(abs(ds1),abs(ds2))) << '/'
					<< (ds2)/abs(__gcd(abs(ds1),abs(ds2))) << '+';}
				}
				int cache_int = __gcd(del_c.first,abs(2*a));
				del_c.first = del_c.first/cache_int;
				int out_rat = abs(2*a)/cache_int;
				if(del_c.first!=1) cout << del_c.first << '*';
				if(out_rat!=1)
				cout << ((del_c.second==1)?("1/"):
				("sqrt(" + to_string(del_c.second) + ")/")) << out_rat << '\n';
				else cout << (del_c.second==1?("1\n"):
				("sqrt(" + to_string(del_c.second) + ")\n"));
			} else
			{
				if(2*a>0)
				{
//					cout << "blah\n";
					if((int)sqrt(delta)-b==0) cout << "0\n";
		   			else if(can_div((int)sqrt(delta)-b,2*a))
					cout << cor_zero((sqrt(delta)-b)/cor_zero(2*a)) << '\n';
					else{int ds1=(int)sqrt(delta)-b,ds2=2*a;
					if(ds1>=0&&ds2<0) ds1=(0-ds1),ds2=(0-ds2);
					else if(ds1<0&&ds2<0) ds1=(0-ds1),ds2=(0-ds2);
					cout << cor_zero(ds1)/abs(__gcd(abs(ds1),abs(ds2))) << '/'
					<< cor_zero(ds2)/abs(__gcd(abs(ds1),abs(ds2))) << '\n';}
				}else
				{
					if(0-(int)sqrt(delta)-b==0) cout << "0\n";
					else if(can_div(0-(int)sqrt(delta)-b,2*a))
					cout << cor_zero(0-(int)sqrt(delta)-b)/cor_zero(2*a) << '\n';
					else{int ds1=0-(int)sqrt(delta)-b,ds2=2*a;
					if(ds1>=0&&ds2<0) ds1=(0-ds1),ds2=(0-ds2);
					else if(ds1<0&&ds2<0) ds1=(0-ds1),ds2=(0-ds2);
					cout << cor_zero(ds1)/abs(__gcd(abs(ds1),abs(ds2))) << '/'
					<< cor_zero(ds2)/abs(__gcd(abs(ds1),abs(ds2))) << '\n';}
				}
			}
		}
	}
	return 0;
}
                                                           
2024/10/11 22:34
加载中...