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;
}
posted @ 2021-12-21 21:05  Eason_AC  阅读(43)  评论(0)    收藏  举报