A35533. 一元二次方程(uqe)样例 1 输入9 10001 ‐1 0‐1 ‐1 ‐11 ‐2 11 5 44 4 11 0 ‐4321 ‐3 12 ‐4 11 7 1样例 1 输出1NO1‐1‐1/212*sqrt(3)3/2+sqrt(5)/21+sqrt(2)/2‐7/2+3*sqrt(5)/2
填空题
较难
知识点
题目描述
一元二次方程(uqe)

样例 1 输入
9 1000
1 ‐1 0
‐1 ‐1 ‐1
1 ‐2 1
1 5 4
4 4 1
1 0 ‐432
1 ‐3 1
2 ‐4 1
1 7 1
样例 1 输出
1
NO
1
‐1
‐1/2
12*sqrt(3)
3/2+sqrt(5)/2
1+sqrt(2)/2
‐7/2+3*sqrt(5)/2
参考答案
#include<bits/stdc++.h>
using namespace std;
int t, a, b, c, up;
int main() {
cin >> t >> up;
while (t--) {
cin >> a >> b >> c;
int derta = b * b - 4 * a * c;
if (derta < 0) {
cout << "NO\n";
continue;
}
if ((int)sqrt(derta) * (int)sqrt(derta) == derta) {
int z, m = 2 * a;
if (a < 0) {
z = -sqrt(derta) - b;
} else {
z = sqrt(derta) - b;
}
if (z > 0 && m < 0) {
z = -z, m = -m;
}
if (z < 0 && m < 0) {
z = -z, m = -m;
}
if (z % m == 0) {
cout << z / m;
} else {
int g = __gcd(abs(m), abs(z));
cout << z / g << "/" << m / g;
}
} else {
int uz = -b, um = 2 * a, z = derta;
if (uz != 0) {
if (uz > 0 && um < 0) {
uz = -uz, um = -um;
}
if (uz < 0 && um < 0) {
uz = -uz, um = -um;
}
if (uz % um == 0) {
cout << uz / um;
} else {
int g = __gcd(abs(um), abs(uz));
cout << uz / g << "/" << um / g;
}
cout << "+";
}
int q2 = 1;
for (int i = sqrt(derta); i >= 2; i--) {
if (z % (i * i) == 0) {
q2 = i;
z /= i * i;
break;
}
}
int g = __gcd(abs(a) * 2, q2);
a = abs(a) * 2 / g, q2 /= g;
if (q2 == 1 && a == 1) {
cout << "sqrt(" << z << ")";
} else if (q2 == 1) {
cout << "sqrt(" << z << ")/" << a;
} else if (q2 % a == 0) {
cout << q2 / a << "*sqrt(" << z << ")";
} else {
cout << q2 << "*sqrt(" << z << ")/" << a;
}
}
cout << "\n";
}
return 0;
}
上一题
下一题