2015-09-29 64 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