P9750 [CSP-J 2023] 一元二次方程题目总结

根据题面,我们将分为多种情况讨论:

若a为负数,那么将a,b,c全部取反

首先求出data=b^2-4*a*c;

1,data<=0 cout<<”NO”;

否则

带入求跟公式:-b/2a +(-)sqrt(data)

注意::gcd(a,b)有可能为负数,此处应用abs(x)取绝对值

  1. 若开根号data为有理数{
    1. -b为2*a的倍数则直接输出b
    2. 否则输出b/gcd(b,2*a)<<”/”<<2*a/gcd(b,2*a);
    3. data为2*a的倍数则输出data
    4. data/gcd(data,2*a)<<”/”<<2*a/gcd(data,2*a);

   gcd(a,b)为求a,b两数的最大公约数,此处可用__gcd(a,b)库函数来替代。

}

1.否则 sqrt(data)为无理数{

  1. d=data中能取平方的值,data/=(d*d)

2.-b为2*a的倍数则直接输出b

3.否则输出b/gcd(b,2*a)<<”/”<<2*a/gcd(b,2*a);

  1. d/gcd(d,2*a)==1,则不输出d/gcd(d,2*a)
  2. 否则
  3. d/gcd(d,2*a)<<”*”<<”sqrt(“<<data<<”)”;
  4. 2*a/gcd(d,2*a)==1,则不输出<<”/”2*a/gcd(d,2*a)

否则 输出2*a/gcd(d,2*a)

代码:

#include <bits/stdc++.h>
using namespace std;
#define int long long//宏定义
int m,a,b,c,tot,d,t,k;
int gcd(int a,int b){
    if(b==0)return a;
    return gcd(b,a%b);
}
void qu(){
    cin>>a>>b>>c;
    if(a<0)a=-a,b=-b,c=-c;
    d=b*b-4*a*c,k=1;
    if(d<0){
        cout<<"NO"<<"\n";
        return;
    }
    for(int i=2;i*i<=d;i++)
        while(d%(i*i)==0)d/=(i*i),k*=i;
    if(d==|| d==1){
        t=abs(gcd(2*a,-b+k*d));
        cout<<(-b+k*d)/t;
        if((2*a)/t!=1)cout<<"/"<<(2*a)/t;
        cout<<"\n";
        return;
    }
    t=abs(gcd(-b,2*a));
    if(b/t!=0){
        cout<<-b/t;
        if((2*a)/t!=1)cout<<"/"<<(2*a)/t;
        cout<<"+";
    }
    t=abs(gcd(k,2*a));
    if(k/t!=1)cout<<k/t<<"*";
    cout<<"sqrt("<<d<<")";
    if((2*a)/t!=1)cout<<"/"<<(2*a)/t;
    cout<<"\n";
    return;
}
signed main(){
    ios::sync_with_stdio(0);
    cin.tie(0);cout.tie(0);//取消同步
    int t;
    cin>>t>>m;
    while(t--)
        qu();
    return 0;
}

 

题目心得:

在做难题时需要有努力去钻,不能半途而废,看见难题就跳过。

大模拟需要加强,分情况讨论需要思考明白再动笔,题目需理解透彻:宁花5分钟读题也不花1小时调代码。

 

posted @ 2024-08-10 14:49  谦谦2020  阅读(90)  评论(0编辑  收藏  举报