1 solutions
-
0
模拟(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