2

これは、リンクされたリストを使用した 2 つの多項式の加算の実装です。
たとえば、
3x^2+5^x+3 と 4x^3+5x+2 を追加したい場合

最初に、2 つの多項式に同様の指数があるかどうかを確認し、ある場合はそれらの係数を追加し、指数を文字列に追加します。
同様の指数を追加した後、文字列を使用して、両方の多項式の残りの部分を最終結果に追加します。

 public class Node2{
        int coef;
        int exp;
        Node2 next;
        Node2(int c,int e,Node2 n){
            coef=c;
            exp=e;
            next=n;
        }
        Node2(int c,int e){
            coef=c;
            exp=e;

        }


}

public class LinkedPoly{
    static String exponent="";
    Node2 head;
    Node2 current;

LinkedPoly(){
    head=null;

}
public void createList(int c,int e){
    head=new Node2(c,e,head);
}

public static LinkedPoly add(LinkedPoly list1,LinkedPoly list2){
    LinkedPoly addList=new LinkedPoly();

    Node2 temp1=list1.head;
            Node2 temp3=temp1;
    Node2 temp2=list2.head;
            Node2 temp4=temp2;
    while(temp1.next!=null){
        while(temp2.next!=null){
            if(temp1.exp==temp2.exp){

            addList.createList((temp1.coef+temp2.coef),temp1.exp);
            exponent+=temp1.exp;

            }
            temp2=temp2.next;
        }
        temp1=temp1.next;
        temp2=temp4;
    }
    String[] array=exponent.split("");
    for(int i=1;i<array.length;i++){

        while(temp3.next!=null){
            if(temp3.exp!=Integer.parseInt(array[i])){
                addList.createList(temp3.coef,temp3.exp);
            }
            temp3=temp3.next;
        }
        while(temp4.next!=null){
            if(temp4.exp!=Integer.parseInt(array[i])){
                addList.createList(temp4.coef,temp4.exp);
            }
            temp4=temp4.next;
        }
    }

    return addList;
}


public static void main (String args[]){
    LinkedPoly l1=new LinkedPoly();
    l1.createList(3,2);
    l1.createList(5,1);
    l1.createList(3,0);
    LinkedPoly l2=new LinkedPoly();
    l2.createList(4,3);
    l2.createList(5,1);
    l2.createList(2,0);

    LinkedPoly l3=add(l1,l2);
    System.out.println(l3.head.next.next.coef);
}

}

私の例によると、指数文字列には 1 と 0 が含まれていますが、1 の係数を合計するだけです。また、残りの加算も間違っています。

どこを間違えているのかわかりません。また、この実装が正常に機能するかどうかを確認できるように、最終的な addList を出力するにはどうすればよいですか

4

1 に答える 1

3

動作する add メソッドは次のとおりです。

public static LinkedPoly add(LinkedPoly list1,LinkedPoly list2){
    LinkedPoly addList=new LinkedPoly();

    Node2 temp1=list1.head;
    Node2 temp3=temp1;
    Node2 temp2=list2.head;
    Node2 temp4=temp2;
    while(temp1.next!=null){
        while(temp2.next!=null){
            if(temp1.exp==temp2.exp){

                addList.createList((temp1.coef+temp2.coef),temp1.exp);
                exponent+=temp1.exp;

            }
            temp2=temp2.next;
        }
        temp1=temp1.next;
        temp2=temp4;
        addList.print();
    }
    String[] array=exponent.split("");


    while(temp3!=null){
        boolean exponentPresent = false;
        for(int i=1;i<array.length;i++){
            if(temp3.exp==Integer.parseInt(array[i])){
                exponentPresent = true;
            }
        }
        if (!exponentPresent) {
            addList.createList(temp3.coef,temp3.exp);
        }
        temp3=temp3.next;
    }
    while(temp4!=null){
        boolean exponentPresent = false;
        for(int i=1;i<array.length;i++){
            if(temp4.exp==Integer.parseInt(array[i])){
                exponentPresent = true;
            }
        }
        if (!exponentPresent) {
            addList.createList(temp4.coef,temp4.exp);
        }
        temp4=temp4.next;
    }


    return addList;
}

LinkedPoly クラスに追加できる print メソッドは次のとおりです。

public void print() {
    current = head;
    System.out.print(current.coef + "x^" + current.exp);
    while (current.next != null) {
        current = current.next;
        System.out.print(" + " + current.coef + "x^" + current.exp);
    }
    System.out.println();
}

add メソッドには 2 つの主な問題がありました。

問題#1。1 つ目は、既に含まれている指数の配列を通るループが、多項式リンク リストのノードを通るループの外側にあったことです。内側にある必要があります。以前に行っていた方法では、プロセスは次のようになりました。

a. 配列から既に含まれている指数の 1 つを取得します b. 各多項式 c のすべての項を調べます。これらの項のいずれかに、パート a. の指数と一致しない指数がある場合は、それを結果に追加します。d. パート a. から繰り返しますが、既に含まれている次の指数を使用します。

このアプローチの問題は、指数が既に含まれている用語のいずれにも一致しない場合にのみ、新しい項を結果に追加する必要があることです。それらのいずれにも一致しない場合だけではありません。これが、結果に余分な x^1 項がすべて含まれている理由です。プログラムが配列の「0」要素にあるとき、多項式の x^1 項を追加していました。

問題#2。while (temp3.next!= null) または (temp4.next!=null) を (temp3!=null) または (temp4!=null) に置き換える必要があります。そうしないと、コードは多項式の最後のノードに到達しません (最後のノードの後に​​「次の」ノードがあるかどうかを確認しているため、最後のノードの前で停止します)。これが、結果に x^3 および x^4 項が含まれていない理由です。これらの項に到達する前にループが終了していました。

いくつかの考慮事項

  1. 多くの一時変数を使用します。それらにもっとわかりやすい名前を付けてみてください。
  2. 既に使用されている指数を「指数」文字列に追加し、それを split() メソッドで配列に分割する理由がわかりません。最初から配列に追加することを検討してください。
  3. add メソッドは、おそらく再構築されて、よりクリーンになる可能性があります。2 つの多項式に共通する指数を確認し、それらを処理してから、共通していない指数を個別に処理する代わりに、これを試すことができます。任意の多項式で最大の指数を見つけます。次に、0 からその数値までのすべての指数度を循環します。これらの各サイクル内で、各多項式を循環し、その指数を持つすべての多項式の係数を合計します。そうすれば、コードはすべて 1 つの大きなループになります。
  4. 現在、あなたのコードは、多項式がその項を順番に保つことを保証していません - x^2 項が ax^1 項の前にある ax^3 項の前に来るのを止める方法はありません。LinkedPoly クラスに sort() メソッドを追加するか、ノードの追加中にコードを追加して多項式が適切な順序に保たれるようにするか、上記の提案 3 を使用して和多項式を作成時にソートできるようにすることを検討してください。または、それらを順番に並べることが重要でない場合は、気にしないでください:)
于 2014-06-25T02:28:34.577 に答える