2015-09-29 32 views
1

我的乘法逻辑在某处不正确。似乎我没有考虑何时必须添加两个多项式相乘的结果相同程度的项。多项式乘法度数学与链接列表不正确

public Polynomial multiply(Polynomial p) { 
    if (p.poly == null || this.poly == null) { 
     Polynomial zero = new Polynomial(); 
     zero.poly = new Node (0, 0, null); 
     return zero; 
    } else { 

     Polynomial retPol = new Polynomial(); 
     retPol.poly = new Node(0, 0, null); 

     Node front = retPol.poly; 
     Node entered = p.poly; 
     Node thisPol = this.poly; 

     int high = Integer.MIN_VALUE; 
     int low = Integer.MAX_VALUE; 

     while (entered != null) { 
      thisPol = this.poly; 

      while (thisPol != null) { 
       if (thisPol.term.degree + entered.term.degree > high) 
        high = thisPol.term.degree + entered.term.degree; 
       if (thisPol.term.degree + entered.term.degree < low) 
        low = thisPol.term.degree + entered.term.degree; 

       thisPol = thisPol.next; 
      } 

      entered = entered.next; 
     } 

     entered = p.poly; 

     Node create = front; 
     for (int i = low; i <= high; i++) { 
      create.term.degree = i; 
      create.term.coeff = 0; 

      create.next = new Node (0, 0, null); 
      create = create.next; 
     } 

     entered = p.poly; 

     while (entered != null) { 
      thisPol = this.poly; 

      while (thisPol != null) { 
       int degree = entered.term.degree + thisPol.term.degree; 
       create = front; 

       while (create != null) { 
        if (create.term.degree == degree) { 
         create.term.coeff = entered.term.coeff * thisPol.term.coeff; 
        } 

        create = create.next; 
       } 

       thisPol = thisPol.next; 
      } 

      entered = entered.next; 
     } 

     create = front; 

     while (create != null) { 
      if (create.term.degree == high) { 
       create.next = null; 
       create = create.next; 
      } 
      else 
       create = create.next; 
     } 

     retPol.poly = front; 

     return retPol; 
    } 
} 

我应该得到的答案是:

32.0x^9 + 16.0x^8 + -16.0x^7 + -20.0x^6 + 52.0x^5 + 38.0x^4 + -6.0x^3 + -6.0x^2 + 9.0x + 27.0

,但我真的开始:

32.0x^9 + 16.0x^8 + -16.0x^7 + -8.0x^6 + 16.0x^5 + 24.0x^4 + 12.0x^3 + -6.0x^2 + -9.0x + 27.0

看来,3〜6度逻辑不正确。这是一个逻辑错误,我知道。我只是不知道如何解决。我也知道应该为那些不正确的学位添加条款,但是它看起来好像绕过了那个,只显示了一个。

任何提示将不胜感激。谢谢。

回答

0

我想你应该概括了所有对而不是在这里采摘最后的(或随机的)对:

   if (create.term.degree == degree) { 
        create.term.coeff += entered.term.coeff * thisPol.term.coeff; 
       } 

[更新]您与我校代码工​​作完美的我:

public class PolynomialTest { 
    public static void main(String[] args) { 
     // 4x^5 - 2x^3 + 2x + 3 
     Polynomial p1 = new Polynomial(new Node(4.0, 5, new Node(-2.0, 3, new Node(2.0, 1, new Node(3.0, 0, null))))); 
     // 8x^4 + 4x^3 - 3x + 9 
     Polynomial p2 = new Polynomial(new Node(8.0, 4, new Node(4.0, 3, new Node(-3.0, 1, new Node(9.0, 0, null))))); 
     Polynomial p3 = p1.multiply(p2); 
     System.out.println(p3.toString()); 
    } 
} 

class Term { 
    int degree; 
    double coeff; 
} 

class Node { 
    Term term; 
    Node next; 
    public Node(double coeff, int degree, Node next) { 
     this.term = new Term(); 
     this.term.degree = degree; 
     this.term.coeff = coeff; 
     this.next = next; 
    } 
} 

class Polynomial { 
    private Node poly; 

    public Polynomial() {} 

    public Polynomial(Node poly) { 
     this.poly = poly; 
    } 

    public Polynomial multiply(Polynomial p) { 
     if (p.poly == null || this.poly == null) { 
      Polynomial zero = new Polynomial(); 
      zero.poly = new Node (0, 0, null); 
      return zero; 
     } else { 

      Polynomial retPol = new Polynomial(); 
      retPol.poly = new Node(0, 0, null); 

      Node front = retPol.poly; 
      Node entered = p.poly; 
      Node thisPol = this.poly; 

      int high = Integer.MIN_VALUE; 
      int low = Integer.MAX_VALUE; 

      while (entered != null) { 
       thisPol = this.poly; 

       while (thisPol != null) { 
        if (thisPol.term.degree + entered.term.degree > high) 
         high = thisPol.term.degree + entered.term.degree; 
        if (thisPol.term.degree + entered.term.degree < low) 
         low = thisPol.term.degree + entered.term.degree; 

        thisPol = thisPol.next; 
       } 

       entered = entered.next; 
      } 

      entered = p.poly; 

      Node create = front; 
      for (int i = low; i <= high; i++) { 
       create.term.degree = i; 
       create.term.coeff = 0; 

       create.next = new Node (0, 0, null); 
       create = create.next; 
      } 

      entered = p.poly; 

      while (entered != null) { 
       thisPol = this.poly; 

       while (thisPol != null) { 
        int degree = entered.term.degree + thisPol.term.degree; 
        create = front; 

        while (create != null) { 
         if (create.term.degree == degree) { 
          create.term.coeff += entered.term.coeff * thisPol.term.coeff; 
         } 

         create = create.next; 
        } 

        thisPol = thisPol.next; 
       } 

       entered = entered.next; 
      } 

      create = front; 

      while (create != null) { 
       if (create.term.degree == high) { 
        create.next = null; 
        create = create.next; 
       } 
       else 
        create = create.next; 
      } 

      retPol.poly = front; 

      return retPol; 
     } 
    } 

    @Override 
    public String toString() { 
     StringBuilder sb = new StringBuilder(); 
     Node n = poly; 
     while (n != null) { 
      if (sb.length() > 0) 
       sb.append(" + "); 
      sb.append(n.term.coeff); 
      if (n.term.degree > 0) 
       sb.append("x"); 
      if (n.term.degree > 1) 
       sb.append("^").append(n.term.degree); 
      n = n.next; 
     } 
     return sb.toString(); 
    } 
} 

此代码正好打印出您期望的内容:

27.0 + 9.0x + -6.0x^2 + -6.0x^3 + 38.0x^4 + 52.0x^5 + -20.0x^6 + -16.0x^7 + 16.0x^8 + 32.0x^9 
+0

我试过实现这个,但仍然没有运气 –

+0

你的意思是没有运气?错误的数字? – rsutormin

+0

你想要乘以多少?您只显示了没有输入的预期结果多项式。 – rsutormin