水平太渣,写的又臭又长,帮忙优化一下
查看原帖
水平太渣,写的又臭又长,帮忙优化一下
1106976
fankejing楼主2023/11/24 16:14
#include <iostream>
#include <map>
#include <algorithm>
#include <cmath>
#include <stdio.h>
using namespace std;

long long isPrime(long long n){
    map<int,int> num;
    int result = 0;
    if(n==0 || n==1){
        return n;
    }
    else{
        for(int i=2;i*i<=n;i++){
            while(n%i == 0){
                num[i]++;
                n /= i;
            }
            if(num[i]>=2){
                if(result == 0)
                    result = pow(i,(num[i]/2));
                else
                    result *= pow(i,(num[i]/2));//偶数个可以开方
            }
        }
        
        return result;
    }
}


long long GCD(long long a,long long b){
    if(b==0)
        return a;
    else
        return GCD(b,a%b);
}

int main(){
    long long T,M;
    long long a,b,c;
    long long value;
    
    cin>>T>>M;
    for(int i=1;i<=T;i++){
        cin>>a>>b>>c;
        //cout<<i<<" "<<a<<" "<<b<<" "<<c<<" ";
        value = b*b-4*a*c;
        if(value<0){
            cout<<"NO"<<'\n';
        }
        else{
            //开始
            long long s = 0;
            
            s = isPrime(value);
            //cout<<value<<'\t'<<s<<'\n';
            long long ss;
            if(s == 0 || s*s==value){
                ss = 0;
            }
            else{
                ss = value/(s*s);
            }
            //无理数
            if(value==0 || value==1){
                //cout<<"ok";
                long long tmpx;
                if(a>0){
                    tmpx = -b+value;
                }
                else{
                    tmpx = -b-value;
                }
                long long gcd = GCD(tmpx,2*a);
                long long x = (tmpx)/gcd;
                long long y = 2*a/gcd;
                if((x>0&&y>0) || (x<0&&y<0)){
                    if(abs(y)==1){
                        printf("%lld",abs(x));
                        cout<<'\n';
                    }
                    else{
                        printf("%lld/%lld",abs(x),abs(y));
                        cout<<'\n';

                    }
                }
                else{
                    if(abs(y)==1){
                        if(abs(x)==0){
                            printf("%lld",abs(x));
                            cout<<'\n';
                        }
                        else{
                            printf("-%lld",abs(x));
                            cout<<'\n';
                        }
                    }
                    else{
                        printf("-%lld/%lld",abs(x),abs(y));
                        cout<<'\n';
                    }
                }
                
            }

            else if(s == 0){
                //cout<<"one"<<'\n';
                long long gcd = GCD(-b,2*a);
                long long x = -b/gcd;
                long long y = 2*a/gcd;
                if((x>0&&y>0) || (x<0&&y<0)){
                    if(abs(y)==1){
                        printf("%lld+sqrt(%lld)",abs(x),value);
                        printf("\n");
                    }
                    else{
                        printf("%lld/%lld+sqrt(%lld)/%lld",abs(x),abs(y),value,abs(2*a));
                        printf("\n");
                    }
                }
                else{
                    if(abs(y)==1)
                        if(b==0){
                            printf("sqrt(%lld)",value);
                            printf("\n");
                        }
                        else{
                            printf("-%lld+sqrt(%lld)",abs(x),value);
                            printf("\n");
                        }
                    else
                        if(b==0){
                            printf("sqrt(%lld)/%lld",value,abs(2*a));
                            printf("\n");
                        }
                        else{
                            printf("-%lld/%lld+sqrt(%lld)/%lld",abs(x),abs(y),value,abs(2*a));
                            printf("\n");
                        }
                }
            }
            //部分可开方
            else if(s>0&&ss>1){
                //cout<<"two"<<'\n';
                long long gcd = GCD(-b,2*a);
                long long gcd1 = GCD(s,2*a);
                long long x = -b/gcd;
                long long y = 2*a/gcd;
                long long z = abs(s/gcd1);
                long long w = 2*a/gcd1;
                if((x>0&&y>0) || (x<0&&y<0)){
                    if(abs(y)==1 && abs(w)==1){
                        if(z==1){
                            printf("%lld+sqrt(%lld)",abs(x),ss);
                            printf("\n");
                        }
                        else{
                            printf("%lld+%lld*sqrt(%lld)",abs(x),z,ss);
                            printf("\n");
                        }
                    }
                    else if(abs(y)==1 && abs(w)!=1){
                        if(z==1){
                            printf("%lld+sqrt(%lld)/%lld",abs(x),ss,abs(w));
                            printf("\n");
                        }
                        else{
                            printf("%lld+%lld*sqrt(%lld)/%lld",abs(x),z,ss,abs(w));
                            printf("\n");
                        }
                    }
                    else if(abs(y)!=1 && abs(w)==1){
                        if(z==1){
                            printf("%lld/%lld+sqrt(%lld)",abs(x),abs(y),ss);
                            printf("\n");
                        }
                        else{
                            printf("%lld/%lld+%lld*sqrt(%lld)",abs(x),abs(y),z,ss);
                            printf("\n");
                        }
                    }
                    else{
                        if(z==1){
                            printf("%lld/%lld+sqrt(%lld)/%lld",abs(x),abs(y),ss,abs(w));
                            printf("\n");
                        }
                        else{
                            printf("%lld/%lld+%lld*sqrt(%lld)/%lld",abs(x),abs(y),z,ss,abs(w));
                            printf("\n");
                        }
                    }
                }
                else{
                    if(abs(y)==1 && abs(w)==1){
                        if(b==0 && z==1){
                            printf("sqrt(%lld)",ss);
                            printf("\n");
                        }
                        else if(b==0){
                            printf("%lld*sqrt(%lld)",z,ss);
                            printf("\n");
                        }
                        else if(z==1){
                            printf("-%lld+sqrt(%lld)",abs(x),ss);
                            printf("\n");
                        }
                        else{
                            printf("-%lld+%lld*sqrt(%lld)",abs(x),z,ss);
                            printf("\n");
                        }
                    }
                    else if(abs(y)==1 && abs(w)!=1){
                        if(b==0 && z==1){
                            printf("sqrt(%lld)/%lld",ss,abs(w));
                            printf("\n");
                        }
                        else if(b==0){
                            printf("%lld*sqrt(%lld)/%lld",z,ss,abs(w));
                            printf("\n");
                        }
                        else if(z==1){
                            printf("-%lld+sqrt(%lld)/%lld",abs(x),ss,abs(w));
                            printf("\n");
                        }
                        else{
                            printf("-%lld+%lld*sqrt(%lld)/%lld",abs(x),z,ss,abs(w));
                            printf("\n");
                        }
                    }
                    else if(abs(y)!=1 && abs(w)==1){
                        if(b==0 && z==1){
                            printf("sqrt(%lld)",ss);
                            printf("\n");
                        }
                        else if(b==0){
                            printf("%lld*sqrt(%lld)",z,ss);
                            printf("\n");
                        }
                        else if(z==1){
                            printf("-%lld/%lld+sqrt(%lld)",abs(x),abs(y),ss);
                            printf("\n");
                        }
                        else{
                            printf("-%lld/%lld+%lld*sqrt(%lld)",abs(x),abs(y),z,ss);
                            printf("\n");
                        }
                    }
                    else{
                        if(b==0 && z==1){
                            printf("sqrt(%lld)/%lld",ss,abs(w));
                            printf("\n");
                        }
                        else if(b==0){
                            printf("%lld*sqrt(%lld)/%lld",z,ss,abs(w));
                            printf("\n");
                        }
                        else if(z==1){
                            printf("-%lld/%lld+sqrt(%lld)/%lld",abs(x),abs(y),ss,abs(w));
                            printf("\n");
                        }
                        else{
                            printf("-%lld/%lld+%lld*sqrt(%lld)/%lld",abs(x),abs(y),z,ss,abs(w));
                            printf("\n");
                        }
                    }
                }
            }
            //有理数
            else if((s>0&&ss==0)){
                //cout<<"three"<<'\t'<<value<<'\t'<<s<<'\n';
                long long x = 0;
                if(a>0)
                    x = -b+s;
                else
                    x = -b-s;
                long long gcd = GCD(x,2*a);
                long long y = x/gcd;
                long long z = 2*a/gcd;
                if(abs(z)==1){
                    printf("%lld",y);
                    printf("\n");
                }
                else
                    if((y>0&&z>0) || (y<0&&z<0)){
                        printf("%lld/%lld",abs(y),abs(z));
                        printf("\n");
                    }
                    else{
                        printf("-%lld/%lld",abs(y),abs(z));
                        printf("\n");
                    }
            }
        }
    }
}
2023/11/24 16:14
加载中...