簡體   English   中英

添加兩個多項式 Java 程序

[英]Add Two Polynomials Java Program

我正在研究這個添加兩個多項式的簡單程序。 但是,我得到了錯誤的結果,無法發現錯誤。

import java.util.LinkedList;

public class Polynomial {

    private LinkedList<Term> terms = new LinkedList<Term>();


    private class Term {

        private int coef;
        private int exp;

        public Term(int coef, int exp) {
            this.coef = coef;
            this.exp = exp;
        }

        public int getCoef() {
            return coef;
        }

        public int getExp() {
            return exp;
        }

        public String toString() {
            return (this.coef + "x^" + this.exp);
        }
    }

    public String addPoly(String first, String second) {

        LinkedList<Term> otherTerms = new LinkedList<Term>();

        String result = "";

        String [] termsArray1 = first.split(";");
        String [] termsArray2 = second.split(";");

        for (int i = 0; i < termsArray1.length; i++) {
            String [] temp = termsArray1[i].split("x\\^");

            int currentCoef = Integer.parseInt(temp[0]);
            int currentExp = Integer.parseInt(temp[1]);

            Term currentTerm = new Term(currentCoef, currentExp);
            terms.add(currentTerm);
        }

        for (int i = 0; i < termsArray2.length; i++) {
            String [] temp = termsArray2[i].split("x\\^");

            int currentCoef = Integer.parseInt(temp[0]);
            int currentExp = Integer.parseInt(temp[1]);

            Term currentTerm = new Term(currentCoef, currentExp);
            otherTerms.add(currentTerm);
        }

        int i = 0;
        int j = 0;

       while (true){

           if(i == terms.size() || j == otherTerms.size()) {
               break;
           }

           if(terms.get(i).getExp() < otherTerms.get(j).getExp()) {
              result += (otherTerms.get(j).toString() + ";");

               j++;
           }

           if(terms.get(i).getExp() > otherTerms.get(j).getExp()) {
               result += (terms.get(i).toString() + ";");

               i++;
           }

           if(terms.get(i).getExp() == otherTerms.get(j).getExp()) {
               Term temp = new Term((terms.get(i).getCoef() + otherTerms.get(j).getCoef()), terms.get(i).getExp());
               result += (temp.toString() + ";");
               i++;
               j++;
           }
       }

       result = result.substring(0, result.length()-1);
       return result;
    }
}

::測試::

字符串 s3 = "5x^2;-4x^1;3x^0";

字符串 s4 = "6x^4;-1x^3;3x^2";

多項式 p = 新多項式();

System.out.println(p.addPoly(s4, s3));

預期結果:6x^4;-1x^3;7x^2;-4x^1;3x^0

實際結果:3x^4;7x^2;-1x^1;10x^0

問題是,當您的循環退出時,以下情況之一仍然可能為真:

  • i < terms.size()
  • j < j == otherTerms.size()

您的示例輸入就是這種情況。 這意味着其中一項條款的一部分尚未處理並集成到 output 中。

第二個問題是您的多個if語句不是排他性的。 在執行第一個if塊並且j++已經執行之后,很可能j在評估第二個if時是otherTerms中的無效索引。 應該通過將第二個和第三個if轉換為else if來避免這種情況。

這是該循環的修復:

    while (i < terms.size() || j < otherTerms.size()) {
        if(i == terms.size() || j < otherTerms.size() && terms.get(i).getExp() < otherTerms.get(j).getExp()) {
            result += (otherTerms.get(j).toString() + ";");
            j++;
        }
        else if(j == otherTerms.size() || i < terms.size() && terms.get(i).getExp() > otherTerms.get(j).getExp()) {
            result += (terms.get(i).toString() + ";");
            i++;
        } 
        else if(terms.get(i).getExp() == otherTerms.get(j).getExp()) {
            Term temp = new Term((terms.get(i).getCoef() + otherTerms.get(j).getCoef()), terms.get(i).getExp());
            result += (temp.toString() + ";");
            i++;
            j++;
        }
    }

更好的方法

你的方法不是真的 OOP。 理想情況下,第一個表達式應該用於創建Polynomial的一個實例,而另一個表達式應該用於創建Polynomial的另一個實例。 然后應該有一個方法可以將另一個Polynomial實例添加到自己的實例中。 最后應該有一個toString方法,它將實例作為所需格式的字符串返回。 您的驅動程序代碼將如下所示:

        Polynomial a = new Polynomial("5x^2;-4x^1;3x^0");    
        Polynomial b = new Polynomial("6x^4;-1x^3;3x^2");
        Polynomial sum = a.addPoly(b);
        System.out.println(sum.toString());

這更加面向 object,並且會自動避免您當前擁有的代碼重復。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM