社区讨论
诸位大佬,蒟蒻CSP-JT3求调,急急急!!感激不尽
学术版参与者 2已保存回复 2
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 2 条
- 当前快照
- 1 份
- 快照标识符
- @loauat80
- 此快照首次捕获于
- 2023/10/29 10:16 2 年前
- 此快照最后确认于
- 2023/11/02 10:57 2 年前
C
#include<iostream>
#include<cmath>
using namespace std;
int T,M,a,b,c;
int gcd(int a,int b)
{
if(b==0) return a;
else return gcd(b,a%b);
}
void solve(int a,int b,int c)
{
if(a==0)//题目没有描述a!=0,记得特殊判断,后面a会作为分母的
{
cout<<"NO"<<endl;
return ;
}
int dt=b*b-4*a*c;
if(dt<0)//不存在解
{
cout<<"NO"<<endl;
return ;
}
if(dt==int(sqrt(dt))*int(sqrt(dt)))//验证完全平方根
{
//能开平方说明存在分子为整数的解
int q1,q2=2*a;//分子,分母
if(a<0) q1=-b-sqrt(dt);//为了保证答案较大,sqrt(dt)必须和a同符号
else q1=-b+sqrt(dt);
int g=gcd(abs(q1),abs(q2));//约分
if(q1%q2==0)//存在整数解
{
cout<<q1/q2;
}
else//存在分数解
{
if(q1>0 && q2>0 || q1<0 && q2<0)//注意符号
{
cout<<abs(q1)/g<<"/"<<abs(q2)/g;
}
else
{
cout<<"-"<<abs(q1)/g<<"/"<<abs(q2)/g;
}
}
return ;
}
else//不能完全开平方根
{
int q1=-b,q2=2*a,q3=dt;
//(-b+sqrt(b^2-4ac))/2a = (q1+sqrt(q3))/q2;
//接下来对q3进行提取完全平方数,转换成 (q1+q4*sqrt(q3))/q2的形式
int q4=1;
for(int i=2;i*i<=q3;i++)
{
int x=i*i;
while(q3%x==0)
{
q3/=x;
q4*=i;
}
}
//注意输出形式为 q1/q2+q4 sqrt(q3)/q2;
//所以要分开约分
int g1=gcd(abs(q1),abs(q2));
//1.前半段 q1/q2 的输出
bool flag=true;
if(q1==0)
{
//特别注意q1为0,什么都不输出,但是他会影响到后半段的开头是否需要+号
flag=false;//判断前半段是否为0
}
else if(q1%q2==0)//存在整数解
{
cout<<q1/q2;
}
else//存在分数解
{
if(q1>0 && q2>0 || q1<0 && q2<0)//注意符号
{
cout<<abs(q1)/g1<<"/"<<abs(q2)/g1;
}
else
{
cout<<"-"<<abs(q1)/g1<<"/"<<abs(q2)/g1;
}
}
//2.后半段 q4/a2 的输出
int g2=gcd(abs(q4),abs(q2));
//输出格式为c*sqrt(q3),特别注意c是否为1,切正负数的正负一定和a是同符号的,这样才能保证是+,才能取得最大
if(flag==true) cout<<"+";//需要+
if(q4%q2==0)//存在整数解
{
int c=abs(q4)/q2;
if(c==1) cout<<"sqrt("<<q3<<")";
else cout<<c<<"*"<<"sqrt("<<q3<<")";
return ;
}
else//存在分数解
{
int c=abs(q4)/g2;
if(c==1)
{
cout<<"sqrt("<<q3<<")"<<"/"<<abs(q2)/g2;
}
else
{
cout<<abs(c)<<"*"<<"sqrt("<<q3<<")"<<"/"<<abs(q2)/g2;
}
return ;
}
}
}
int main()
{
cin>>T>>M;
for(int i=0;i<T;i++)
{
cin>>a>>b>>c;
solve(a,b,c);
}
return 0;
}
万分感谢各位大佬,样例能过,但是提交0分
回复
共 2 条回复,欢迎继续交流。
正在加载回复...