LuoguP2378 因式分解II 题解
Content
输入一个多项式 \(x^2+ax+b\)(不保证 \(a,b\neq0\)),请对这个多项式进行因式分解(形式为 \((x-x_1)(x-x_2)\),其中 \(x_1>x_2\))。
数据范围:\(a,b<2^{31}\)。
Solution
这道题目看上去很简单,做起来却有很多的细节要注意。
首先,我们可以得到一个大致的思路:得到 \(a,b\) 之后利用求根公式求出 \(x_1,x_2\):
\[x_{1,2}=\dfrac{-a\pm\sqrt{a^2-4b}}{2}
\]
当然,这是按照题目进行变化后得到的式子,我想你们应该都熟悉这个:\(\dfrac{-b\pm\sqrt{b^2-4ac}}{2a}\),但因为保证了二次项系数是 \(1\),所以没什么必要。
那么完了以后,我们的因式分解的结果就是 \((x-x_1)(x-x_2)\),当然,首先如果 \(x_1<x_2\),就得要交换。输出的时候分以下三种情况讨论:
- \(x<0\),此时因为前面已经带了负号,所以直接用
printf("(x%d)", x)就好。 - \(x=0\),此时直接输出
x。 - \(x>0\),此时用
printf("(x+%d)", x)输出。
总体来讲就是以上这些操作,还需注意一下将 \(a,b\) 从字符串中提取出来的问题,具体请读者看代码自行理解。
Code
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <iostream>
using namespace std;
string s;
double a, b, flagx, f, now;
void print(int xx) {
if(xx < 0) printf("(x%d)", xx);
else if(!xx) printf("x");
else printf("(x+%d)", xx);
}
int main() {
cin >> s;
int n = s.size();
f = 1;
for(int i = 3; i < n; ++i)
if(s[i] == 'x') flagx = 1;
if(!flagx) {
now = 0;
for(int i = 3; i < n; ++i) {
if(s[i] == '-') f *= -1;
else if(isdigit(s[i])) now = now * 10 + s[i] - '0';
}
b = f * now;
} else {
now = 0;
for(int i = 3; i < n; ++i) {
if(s[i] == 'x' && i == 3) {
a = 1;
now = 0, f = 1;
} else if(s[i] == 'x' && i > 3) {
a = now * f;
now = 0; f = 1;
} else if(s[i] == '-') f *= -1;
else if(isdigit(s[i])) now = now * 10 + s[i] - '0';
// printf("now=%d\n\n", now);
}
b = f * now;
}
double x1 = -(-a + sqrt(a * a - 4 * b)) / 2, x2 = -(-a - sqrt(a * a - 4 * b)) / 2;
// printf("%d %d %d %d\n", a, b, x1, x2);
if(x1 == x2) {
print(x1);
printf("^2");
} else {
if(x1 < x2) swap(x1, x2);
print(x1), print(x2);
}
return 0;
}

浙公网安备 33010602011771号