【问题描述】
一个二项多项式ax^2 + bx + c有时能够分解为两个整系数的一次多项式的乘积。我们应该能将该二项式分解为形如 (<coef>x<sign><num>)(<opneg><coef>x<sign><num>) 的形式。其中<coef>为空或者是一个大于1的正整数,<num>为一个正整数,<sign>为'+'或'-',<opneg>为空或者'-'。<coef>和<num>不能包括前导0。
题目给定a,b,c的值,需要返回分解后的字符串。如果不能按照题目的要求被分解,那么返回"NONE"。如果分解的结果不止一个的话,那么选择<coef>较大的在前面,如果结果还多于一个,那么当x等于0的时候因式值较大的放在前面。
定义:
类 Factorer
方法 public String factor(int a, int b, int c)
约束:
1、a,b,c取值在-1,000,000,000至1,000,000,000之间(包括)。
2、a,c不为0。
测试用例:
1、1 0 -1
Returns: "(x+1)(x-1)"
2、-4 4 -1
Returns: "(2x-1)(-2x+1)"
3、-4 4 5
Returns: "NONE"
4、1 -3 2
Returns: "(x-1)(x-2)"
注:能得到2个结果"(x-1)(x-2)"、"(x-2)(x-1)",因为x等于0的时候2个因式(x-1和x-2)的值分别为-1和-2,因此因式x-1应该在前面。
5、-20 0 20
Returns: "(20x+20)(-x+1)"
【算法思想】
ax^2+bx+c=(mx+n)(kx+p)=mkx^2+(mp+nk)x+np
本题关键是先取得a和c的所有因式分解的结果,再循环遍历这些结果,以b的值作为判断条件。
一个二项多项式ax^2 + bx + c有时能够分解为两个整系数的一次多项式的乘积。我们应该能将该二项式分解为形如 (<coef>x<sign><num>)(<opneg><coef>x<sign><num>) 的形式。其中<coef>为空或者是一个大于1的正整数,<num>为一个正整数,<sign>为'+'或'-',<opneg>为空或者'-'。<coef>和<num>不能包括前导0。
题目给定a,b,c的值,需要返回分解后的字符串。如果不能按照题目的要求被分解,那么返回"NONE"。如果分解的结果不止一个的话,那么选择<coef>较大的在前面,如果结果还多于一个,那么当x等于0的时候因式值较大的放在前面。
定义:
类 Factorer
方法 public String factor(int a, int b, int c)
约束:
1、a,b,c取值在-1,000,000,000至1,000,000,000之间(包括)。
2、a,c不为0。
测试用例:
1、1 0 -1
Returns: "(x+1)(x-1)"
2、-4 4 -1
Returns: "(2x-1)(-2x+1)"
3、-4 4 5
Returns: "NONE"
4、1 -3 2
Returns: "(x-1)(x-2)"
注:能得到2个结果"(x-1)(x-2)"、"(x-2)(x-1)",因为x等于0的时候2个因式(x-1和x-2)的值分别为-1和-2,因此因式x-1应该在前面。
5、-20 0 20
Returns: "(20x+20)(-x+1)"
- import java.util.ArrayList;
- import java.util.List;
- public class Factorer {
- public String factor(int a, int b, int c) {
- int m = 1, n = 1, k = 1, p = 1;
- List<Integer> alist = getVlaueList(a);
- List<Integer> clist = getVlaueList(c);
- for (Integer im : alist) {
- m = im;
- k = a / m;
- for (Integer in : clist) {
- n = in;
- p = c / n;
- if (check(m, n, k, p, b))
- return getRes(m, n, k, p);
- if (check(m, -n, k, -p, b))
- return getRes(m, -n, k, -p);
- if (check(m, p, k, n, b))
- return getRes(m, p, k, n);
- if (check(m, -p, k, -n, b))
- return getRes(m, -p, k, -n);
- }
- }
- return "NONE";
- }
- private List<Integer> getVlaueList(int num) {
- List<Integer> list = new ArrayList<Integer>();
- num = num > 0 ? num : -num;
- int half = (int) Math.floor(Math.sqrt(num));
- for (int i = 1; i <= half; i++) {
- if (num % i == 0)
- list.add(num/i);
- }
- return list;
- }
- private boolean check(int m, int n, int k, int p, int b) {
- if (m * p + n * k == b)
- return true;
- return false;
- }
- private String getRes(int m, int n, int k, int p) {
- int tmp;
- if (m < k) {
- tmp = k;
- k = m;
- m = tmp;
- } else if (m == k) {
- tmp = n;
- n = p;
- p = tmp;
- }
- StringBuffer sb = new StringBuffer();
- sb.append("(");
- if(m>0)
- sb.append(m==1?"":m);
- else
- sb.append(m==-1?"-":m);
- sb.append("x");
- sb.append(n > 0 ? "+" : "").append(n).append(")(");
- if(k>0)
- sb.append(k==1?"":k);
- else
- sb.append(k==-1?"-":k);
- sb.append("x");
- sb.append(p > 0 ? "+" : "").append(p).append(")");
- return sb.toString();
- }
- }
ax^2+bx+c=(mx+n)(kx+p)=mkx^2+(mp+nk)x+np
本题关键是先取得a和c的所有因式分解的结果,再循环遍历这些结果,以b的值作为判断条件。