Topcoder_2_161

 【问题描述】
    一个二项多项式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)"
  1. import java.util.ArrayList;
  2. import java.util.List;
  3. public class Factorer {
  4.     public String factor(int a, int b, int c) {
  5.         int m = 1, n = 1, k = 1, p = 1;
  6.         List<Integer> alist = getVlaueList(a);
  7.         List<Integer> clist = getVlaueList(c);
  8.         for (Integer im : alist) {
  9.             m = im;
  10.             k = a / m;
  11.             for (Integer in : clist) {
  12.                 n = in;
  13.                 p = c / n;
  14.                 if (check(m, n, k, p, b))
  15.                     return getRes(m, n, k, p);
  16.                 if (check(m, -n, k, -p, b))
  17.                     return getRes(m, -n, k, -p);
  18.                 if (check(m, p, k, n, b))
  19.                     return getRes(m, p, k, n);
  20.                 if (check(m, -p, k, -n, b))
  21.                     return getRes(m, -p, k, -n);
  22.             }
  23.         }
  24.         return "NONE";
  25.     }
  26.     private List<Integer> getVlaueList(int num) {
  27.         List<Integer> list = new ArrayList<Integer>();
  28.         num = num > 0 ? num : -num;
  29.         int half = (int) Math.floor(Math.sqrt(num));
  30.         for (int i = 1; i <= half; i++) {
  31.             if (num % i == 0)
  32.                 list.add(num/i);
  33.         }
  34.         return list;
  35.     }
  36.     private boolean check(int m, int n, int k, int p, int b) {
  37.         if (m * p + n * k == b)
  38.             return true;
  39.         return false;
  40.     }
  41.     private String getRes(int m, int n, int k, int p) {
  42.         int tmp;
  43.         if (m < k) {
  44.             tmp = k;
  45.             k = m;
  46.             m = tmp;
  47.         } else if (m == k) {
  48.             tmp = n;
  49.             n = p;
  50.             p = tmp;
  51.         }
  52.         StringBuffer sb = new StringBuffer();
  53.         
  54.         sb.append("(");
  55.         if(m>0)
  56.             sb.append(m==1?"":m);
  57.         else
  58.             sb.append(m==-1?"-":m);
  59.         sb.append("x");
  60.         sb.append(n > 0 ? "+" : "").append(n).append(")(");
  61.         if(k>0)
  62.             sb.append(k==1?"":k);
  63.         else
  64.             sb.append(k==-1?"-":k);
  65.         sb.append("x");
  66.         sb.append(p > 0 ? "+" : "").append(p).append(")");
  67.         return sb.toString();
  68.     }
  69. }
【算法思想】
    ax^2+bx+c=(mx+n)(kx+p)=mkx^2+(mp+nk)x+np
    本题关键是先取得a和c的所有因式分解的结果,再循环遍历这些结果,以b的值作为判断条件。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值