社区讨论
0pts,求调必关,有注释,急求
P9750[CSP-J 2023] 一元二次方程参与者 1已保存回复 0
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @mhj1y1fm
- 此快照首次捕获于
- 2025/11/03 19:23 4 个月前
- 此快照最后确认于
- 2025/11/03 19:23 4 个月前
CPP
#include<bits/stdc++.h>
using namespace std;
int p[20]; //p[]记录因子,p[1]是最小因子。一个int数的质因子最多有十几个
int m;
void f(int n){//质因数分解
for(int i = 2; i <= sqrt(n); i++){
while(n%i == 0) {
n/=i; //把n中重复的因子去掉
p[m++]=i;
}
}
if(n>1) p[m++] = n; //没有被除尽,是素数
}
int main(){
int t,m;
cin>>t>>m;
while(t--){
int a,b,c;
cin>>a>>b>>c;
int d=b*b-4*a*c;
if(d<0){
// cout<<"answer:NO"<<endl;
cout<<"NO"<<endl;
continue;
}
bool flag=0;
// cout<<"answer:";
a*=2;
int a2=a;
int x=__gcd(b,a);
b/=x;a/=x;//约分
if(b<0&&a<0){//满足分母永远是正数
b=abs(b);
a=abs(a);
}else if(a<0){
a=abs(a);
b=-b;
}
if(b) {
cout<<-b;
flag=1;
}
if(a!=1) {
cout<<'/'<<a;
flag=1;
}
if(d>0){
if(flag) cout<<'+';
m=0;
memset(p,0,sizeof(p));
int xs=1;
if(pow(sqrt(d),2)!=d){//d不是完全平方数
f(d);
for(int i=0;i<m-1;i++){
if(p[i]!=p[i+1]) continue;
xs*=sqrt(p[i]*p[i+1]);
d/=pow(sqrt(p[i]*p[i+1]),2);
i++;
}
}
else{
d=sqrt(d);
xs=1;
}
//d:最简二次根式被开方数 xs:最简二次根式系数
int y=__gcd(xs,a2);
xs/=y;a2/=y;//Ô¼·Ö
if(xs!=1) cout<<xs<<'*';
if(d!=1){
cout<<"sqrt("<<d<<')';
}else{
cout<<d;
}
if(a2==1) continue;
cout<<'/'<<a2<<endl;
}else{
cout<<endl;
}
}
}
回复
共 0 条回复,欢迎继续交流。
正在加载回复...