60pts求调
查看原帖
60pts求调
1369018
leo21楼主2025/8/29 13:09
#include<bits/stdc++.h>
using namespace std;

int T,M;
int a,b,c;
string ans;
int prime_factors(int n){
	int ans=1;
	int x=1;
	int cnt=0;
	while(n%2==0){
		n/=2;
		x*=2;
		cnt++;
	}
	if(cnt%2==0) ans *= sqrt(x);
	else ans *= sqrt(x/2);
	for(int i=3;i<=sqrt(n);i+=2){
		cnt=0;
		x=1;
		while(n%i==0){
			n/=i;
			x*=i;
			cnt++;
		}
		if(cnt%2==0) ans *= sqrt(x);
		else ans *= sqrt(x/i);
		
	}
	return ans;
}
int mysqrt(int x){
	int y = sqrt(x);
	if(y*y==x) return y;
	else return -1;
}
int add(int p,int q){
	int x = __gcd(p,q);
	p/=x,q/=x;
	if(q<0){
		p=-p;
		q=-q;
	}
	if(p==0){
		return 1;
	}
	else if(q==1){
		ans += to_string(p);
	}
	else{
		string a,b;
		a = to_string(p);
		b = to_string(q);
		ans = ans + a + '/'+ b;
	}
	return 0;
}
void add2(int p,int r,int q){
	int x = __gcd(p,q);
	p/=x,q/=x;
	if(p<0){
		p=-p;
		q=-q;
	}
	if(p==q){//p/q==1不行
		ans+="sqrt(";
		ans+=to_string(r);
		ans+=')';
	}
	else{
		if(q==1){
			int y = p/q;
			ans+=to_string(y);
			ans+='*';
			ans+="sqrt(";
			ans+=to_string(r);
			ans+=')';
		}
		else if(p==1){
			ans+="sqrt(";
			ans+=to_string(r);
			ans+=')';
			ans+='/';
			ans+=to_string(q);
		}
		else{
			ans+=to_string(p);
			ans+='*';
			ans+="sqrt(";
			ans+=to_string(r);
			ans+=')';
			ans+='/';
			ans+=to_string(q);
		}
	}
	return ;
}
int main(){
	scanf("%d%d",&T,&M);
	while(T--){
		ans.clear();
		scanf("%d%d%d",&a,&b,&c);
		int d = b*b-4*a*c;
		if(d<0){
			//这部分没有问题
			printf("NO\n");
			continue;
		}
		else{
			//这部分60分都过了
			if(mysqrt(d)!=-1){
				d = sqrt(d);
				if(a>0){
					if(add(-b+d,2*a)){
						ans="0";
					}
				}
				else{
					if(add(-b-d,2*a)){
						ans="0";
					}
				}
			}
			else{
				//这部分40分一分没有得
				int p=prime_factors(d);
				int r=d/(p*p);
				int q=2*a;
				if(q>0){
					b=-b;
					if(p/q<0){
						p=-p;
						b=-b;
					}
					if(!add(b,q)){
						ans+='+';
					}
					add2(p,r,q);
				}
				else{
					
					b=-b;
					p=-p;
					if(p/q<0){
						p=-p;
						b=-b;
					}
					if(add(b,q)){
						ans+='+';
					}
					add2(p,r,q);
				}
			}
			cout<<ans<<endl;
		}
	}
	return 0;
}

样例已过,60分,剩下40分WA,是非完全平方部分。因为我下面这个原先写了一半(完全平方的情况的那部分)的代码交上去的时候也是60分,说白了就是后半部分我写了等于没写都是60分。qwq

#include<bits/stdc++.h>
using namespace std;

int T,M;
int a,b,c;
char ans[1001],m=0;
int prime_factors(){
	
	return 0;
}
int mysqrt(int x){
	int y = sqrt(x);
	if(y*y==x) return y;
	else return -1;
}
void add(int p,int q){
	int x = __gcd(p,q);
	p/=x,q/=x;
	if(q<0){
		p=-p;
		q=-q;
	}
	if(p==0) ans[++m]='0';
	else if(q==1){
		string s = to_string(p);
		int len = s.size();
		for(int i=0;i<len;i++){
			ans[++m] = s[i];
		}
	}
	else{
		string a,b;
		a = to_string(p);
		b = to_string(q);
		int lena = a.size();
		int lenb = b.size();
		for(int i=0;i<lena;i++){
			ans[++m]=a[i];
		}
		ans[++m] = '/';
		for(int i=0;i<lenb;i++){
			ans[++m]=b[i];
		}
	}
	return ;
}
int main(){
	scanf("%d%d",&T,&M);
	while(T--){
		m=0;
		scanf("%d%d%d",&a,&b,&c);
		int d = b*b-4*a*c;
		if(d<0){
			printf("NO\n");
			continue;
		}
		else{
			if(mysqrt(d)!=-1){
				d = sqrt(d);
				if(a>0){
					add(-b+d,2*a);
				}
				else{
					add(-b-d,2*a);
				}
			}
			else{
				
			}
			for(int i=1;i<=m;i++){
				printf("%c",ans[i]);
			}
			printf("\n");
		}
	}
	return 0;
}
2025/8/29 13:09
加载中...