暴力法
2025-07-30 09:06:14
发布于:上海
35阅读
0回复
0点赞
暴力模拟枚举即可:
#include <iostream>
#include <cmath>
using namespace std;
int gcd(int a,int b){
if (b == 0){
return a;
}return gcd(b,a%b);
}void to_simp(int &p,int &q){
if (p == 0){
q = 1;
return;
}int g = gcd(abs(p),abs(q));
p /= g,q /= g;
if (q < 0){
p = -p,q = -q;
}
}void solve(){
int a,b,c,d,k = 1,t,r;
cin >> a >> b >> c;
d = b*b-4*a*c;
if (d < 0){//无解
cout << "NO\n";
return;
}if (d == 0){
int p = -b,q = 2*a;
to_simp(p,q);
if(q == 1){
cout << p << endl;
}else{
cout << p << "/" << q << endl;
}return;
}t = d;// d = k*k+r
for (int i = 2;i*i <= t;i++){
while(t%(i*i) == 0){
t /= i*i,k *= i;
}
}r = t;
if (r == 1){//r == 1 => sqrt(d) = k 有理数形式 方程解x = (-b+(-)k)/(2*a)
int p = (a > 0) ? (-b+k) : (-b-k),q = 2*a;
to_simp(p,q);
if (q == 1){
cout << p << endl;
}else{
cout << p << "/" << q << endl;
}
}else{//无理数 r != 1 sqrt(d) = k*sqrt(r) x = -b/(2*a)+(-)k/(2*a)*sqrt(r)
int p1 = -b,q1 = 2*a;
to_simp(p1,q1);
int s = (a > 0) ? 1 : -1,p2 = s*k,q2 = 2*a;
to_simp(p2,q2);
if (p1 != 0){
if (q1 == 1){
cout << p1;
}else{
cout << p1 << "/" << q1;
}cout << "+";
}if (p2 == 1 && q2 == 1){
cout << "sqrt(" << r << ")";
}else if (q2 == 1){
cout << p2 << "*sqrt(" << r << ")";
}else if (p2 == 1){
cout << "sqrt(" << r << ")/" << q2;
}else{
cout << p2 << "*sqrt(" << r << ")/" << q2;
}cout << endl;
}
}int main(){
freopen("uqe.in","read",stdin);
freopen("uqe.out","w",stdout);
int t,m;
cin >> t >> m;
for (int i = 0;i < t;i++){
solve();
}fclose(stdin);
fclose(stdout);
return 0;
}
这里空空如也
有帮助,赞一个