1 solutions

  • 0
    @ 2024-6-18 16:56:28

    模拟(100pts)

    • 属于比较复杂的模拟题,需要按照题目一步步来。
    #include<bits/stdc++.h>
    using namespace std;
    int gcd(int a,int b) //最大公约数模板
    {
        if(b==0) return a;
        return gcd(b,a%b);
    }
    int main()
    {
        int t,m;
        cin>>t>>m;
        for(int i=1;i<=t;i++)
        {
            int a,b,c;
            cin>>a>>b>>c;
            double delta=b*b-4*a*c;
            if(delta<0) //无解的情况
            {
                cout<<"NO"<<endl;
            }
            else if(delta==0) //唯一解
            {
                int p=-b,q=2*a;
                int k=gcd(p,q);
                p/=k;q/=k;
                if(q<0) //保证分母为正
                {
                    p=-p,q=-q;
                }
               
                if(q==1) cout<<p<<endl;
                else cout<<p<<"/"<<q<<endl;
            }
            else //delta>0的情况
            {
                int p=-b,q=2*a;
                int sd=sqrt(delta);
                if(sd*sd==delta) //完全平方数
                {
                    if(q<0) //保证q>=0
                    {
                        p=-p,q=-q;
                    }
                    p+=sd; //累加后面部分
                    int k=gcd(p,q);
                    p/=k;
                    q/=k;
                    if(q<0) //除完最大公约数后可能为负,
                    {
                        p=-p,q=-q;
                    }
                    if(q==1) cout<<p<<endl;
                    else cout<<p<<"/"<<q<<endl;
                    
                }
                else
                {
                    int k=gcd(p,q); //处理第一个部分
                    p/=k;
                    q/=k;
                    if(q<0)
                    {
                        p=-p;
                        q=-q;
                    }
                    if(p!=0)
                    {
                        if(q==1) cout<<p<<"+";
                        else cout<<p<<"/"<<q<<"+";
                    }
                    int d1=1,d2=delta; //初始化
                    int q=abs(2*a);
                    for(int i=sd;i>=1;i--) //从根开始从大到小枚举
                    {
                        int j=i*i;
                        if(d2%j==0)
                        {
                            d2/=j;
                            d1*=i;
                            break;
                        }
                    }
                    k=gcd(d1,q);
                    d1/=k;
                    q/=k;
                    if(q==d1)printf("sqrt(%d)\n",d2);//只有分子的后面部分
                    else if(q==1) printf("%d*sqrt(%d)\n",d1,d2); //只有分母
                    else if(d1==1) printf("sqrt(%d)/%d\n",d2,q);//前面是1
                    else printf("%d*sqrt(%d)/%d\n",d1,d2,q); //完整的式子
                }
            }
        }
        return 0;
    }
    
    • 1

    Information

    ID
    1264
    Time
    1000ms
    Memory
    256MiB
    Difficulty
    10
    Tags
    # Submissions
    1
    Accepted
    1
    Uploaded By