Java:创建有序多项式

时间:2015-10-07 18:25:49

标签: java if-statement for-loop stringbuilder polynomial-math

给定一个多项式,例如,5x^4 - 1x^2 +2x^2 -3 +5x我创建了以下三个数组,其索引与每个"项目"的变量,度和系数匹配。在多项式中有。

coefficentArray=[5, -3, 2, -1, 5]
variableArray = [x,  , x, x, x]
degreeArray   = [1, 1, 2, 2, 4]  //sorted on

我正在尝试编写将所有"项目加起来的代码"具有相同的度和相同的变量,并返回新多项式的字符串,因此例如我在这里寻找的将是+5x^4 +1x^2 +5x^1 -3x^0。到目前为止,这是我的功能......

    public static String putItTogether(int[] array,int[] array1, String[] array2, int count)
{
    int j = count; //count is number of items in arrays
    StringBuilder builder = new StringBuilder();
    for (int i=count; i<=0 ; i--) {
         int answer = 0;
         while (array[j] == array[j-1]) {   //array = degrees //array1 = coefficients // array2 = variable
              if (array2[j] == array2[j-1]) { //if they both have x in same index
                    answer = array1[j] + array1[j-1];//add the coefficients
              }
         j--;
         }
      String coefficientString = Integer.toString(answer); //create string from answer
      String degreeString = Integer.toString(array[j]); //get the degree and turn it into a String 
      if (answer < 0)
          builder.append("-") //if answer negative, add negative sign
      else
          builder.append("+") // else add positive sign

      builder.append(coefficientString); //add coefficient to builder
      builder.append("x"); //add "x" to coefficient in builder

      builder.append("^"); //add the "^" after the "x"
      builder.append(degreeString); //finally add the degree after the "^"
      buider.append(" "); //add space inbetween
      }
    }
    return builder.toString();
}

使用顶部给出的多项式作为输入,我接收+0x^0 +0x^0。现在盯着它看了几个小时似乎找不到任何东西,所以我想&#39 ; d尝试另外一双眼睛。感谢您的时间,我们非常感激。另外,如果你认为我应该杀了我的小宝贝&#34;代码宝贝&#34;并从不同角度处理问题,不要害怕告诉我!

1 个答案:

答案 0 :(得分:2)

我建议你杀死目前的计划。执行reduce逻辑然后在一个循环中输出all可能非常混乱。相反,您应该在一个方法中执行reduce逻辑,然后使用另一个方法来打印reduce逻辑的结果。

现在对于该方法,度量列表和系数列表对于输入是很好的,我们将保留这些,但如果您的唯一变量是x,则不需要变量列表。我明白为什么你有变量数组(对于常量)但是记住常量C = C * x^0(一个常数的度数为零x^0=1)所以基本上每个项中的每个项都有一个变量{{1 }}

现在,对于减少等式的第一部分,我建议使用一个映射,其中键是变量的程度,值是系数值。这将用于跟踪每个学位的系数值。

注意,等式x的地图看起来像

3x^2 + 2x + 3degree --> coefficient

coefficient x^degree2 --> 3

3 x^21 --> 2

2 x^10 --> 3

所以reduce算法看起来像这样。 。

3 x^0

程序的输出是系数图的程度。然后,您可以使用该地图构建方程式字符串。我们会将每个条目public TreeMap<Integer,Integer> reducePolynomial(int[] coefficients, int[] degrees) { TreeMap<Integer,Integer> polynomials = new TreeMap<Integer,Integer>(); for(int i = 0; i < coefficients.length; i++) { int coefficient = coefficients[i]; int degree = degrees[i]; if(polynomials.containsKey(degree)) { // sum coefficients of the same degree int currentCoefficient = polynomials.get(degree); polynomials.put(degree, currentCoefficient + coefficient); } else { // no coefficient for the current degree, add it to map polynomials.put(degree, coefficient); } } return polynomials; } 转为degree --> coefficient

+-coefficient x^degree

所有这一切背后的想法是将输入列表减少为一个方便的数据结构,然后使用该数据结构输出结果。

最后,如果你想扩展这个算法以使用多个变量(public String outputPolynomial(TreeMap<Integer,Integer> polynomials) { StringBuilder builder = new StringBuilder(); for(Entry<Integer,Integer> polynomial : polynomials.descendingMap().entrySet()) { if(polynomial.getValue() != 0) { // append plus (note negative coefficient will print out a minus sign) if(polynomial.getValue() >= 0) { builder.append("+ "); } // append coefficient builder.append(polynomial.getValue()); builder.append("x^"); // append degree builder.append(polynomial.getKey()); builder.append(" "); } } return builder.toString(); } y,...)那么你可以构建多个映射,每个变量一个,加上一个变量来保持跟踪常数值。

编辑:发表评论

  

z来自哪里?

这是我写的一个错误。我修改了代码,这样如果多项式系数= 0,则不输出当前多项式。

  

如何按降序顺序输出?

我实现了HashMaps,它没有订单但TreeMaps却没有。您可以制作+ 0x^0,然后就可以执行类似

的操作
new TreeMap<Integer,Integer>();

我修改了上面的代码,改为使用TreeMap。