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)取绝对值
- 若开根号data为有理数{
- -b为2*a的倍数则直接输出b
- 否则输出b/gcd(b,2*a)<<”/”<<2*a/gcd(b,2*a);
- 若data为2*a的倍数则输出data
- data/gcd(data,2*a)<<”/”<<2*a/gcd(data,2*a);
gcd(a,b)为求a,b两数的最大公约数,此处可用__gcd(a,b)库函数来替代。
}
1.否则 sqrt(data)为无理数{
- d=data中能取平方的值,data/=(d*d)
2.-b为2*a的倍数则直接输出b
3.否则输出b/gcd(b,2*a)<<”/”<<2*a/gcd(b,2*a);
- 若d/gcd(d,2*a)==1,则不输出d/gcd(d,2*a)
- 否则
- d/gcd(d,2*a)<<”*”<<”sqrt(“<<data<<”)”;
- 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==0 || 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小时调代码。