4472: 一元二次方程 [CSP-J 2023]
内存限制:512 MB
时间限制:1.000 S
评测方式:文本比较
命题人:
提交:1
解决: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
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, m; //最大公约数,约分时候使用 int gcd(int a, int b) { return b == 0 ? a : gcd(b, a % b); } int main() { cin >> t >> m; while (t--) { int a, b, c; cin >> a >> b >> c; int delta = b * b - 4 * a * c; //若delta<0,方程无实数解,输出NO if (delta < 0) { cout << "NO" << endl; continue; } //delta>=0,方程有两个解分别为x1,x2,a的符号不同,则两者中较大的不同 //x的通用表示为x=p/q+sqr_del/q int sqr_del = 1; //求根号delta->sqr_del for (int i = 2; i * i <= delta; i++) { while (delta % (i * i) == 0) sqr_del *= i, delta /= i * i; } int p = -b, q = 2 * a; if (q < 0) q = -q, p = -p; //如果sqr_del是整数,那么p需要加上sqr_del if (delta == 1) delta = 0, p += sqr_del; //x=p/q+sqr_del/q,考虑约分,需要分别求p,q和sqr_del,q的最大公约数g1,g2 int g1 = gcd(abs(p), q), g2 = gcd(sqr_del, q); //如果sqr_del是整数那么答案为p/q if (delta == 0) { if (p % q == 0) cout << p / q; else cout << p / g1 << "/" << q / g1;//约分 } //如果sqr_del不是整数,则需要分别处理p/q和sqr_del/q else { if (p != 0) { if (p % q == 0) cout << p / q; else cout << p / g1 << "/" << q / g1;//约分 cout << "+"; } if (sqr_del / g2 != 1) cout << sqr_del / g2 << "*"; cout << "sqrt(" << delta << ")"; if (q / g2 != 1) cout << "/" << q / g2; } cout << endl; } return 0; }