多项式Java数组添加减法

时间:2017-02-13 07:25:31

标签: java arrays polynomials

我有下面的代码,除了sub()函数试图从另一个中减去一个多项式时,一切似乎都正常工作

p4 = p1.sub(p2);

我看到输出:x+3x^5-5x^8,当我希望看到:x-2x^3+7x^5-2x^7-5x^8时。我无法弄清楚我的代码有什么问题,非常感谢任何帮助。提前谢谢。

public class Polynomial {

public static final int MAX_NUMBER_OF_COEFFICIENTS = 30;
private int[] coefficients = new int[MAX_NUMBER_OF_COEFFICIENTS];

public Polynomial() {
}

public Polynomial(int coefficient, int exponent) {
    coefficients[exponent] += coefficient;
}

public Polynomial(int[] newcoefficients) {
    for (int i = 0 ; i < MAX_NUMBER_OF_COEFFICIENTS; i++) {
        coefficients[i] += newcoefficients[i];
    }
}

public void insert(int coefficient, int exponent) {
    coefficients[exponent] += coefficient;
}

public Polynomial add(Polynomial otherPolynomial) {
    for (int i = 0 ; i < MAX_NUMBER_OF_COEFFICIENTS; i++) {
        if (otherPolynomial.coefficients[i] != 0)
            this.coefficients[i] += otherPolynomial.coefficients[i];
    }
    return new Polynomial(this.coefficients);
}

public Polynomial sub(Polynomial otherPolynomial) {
    for (int i = 0 ; i < MAX_NUMBER_OF_COEFFICIENTS; i++) {
        if (otherPolynomial.coefficients[i] != 0)
            this.coefficients[i] -= otherPolynomial.coefficients[i];
    }
    return new Polynomial(this.coefficients);
}

public void sub(int coefficient, int exponent) {
    this.coefficients[exponent] -= coefficient;
}

public void remove(int exponent) {
    coefficients[exponent] = 0;
}

public void printout() {
    boolean firstPrint = false;
    if (coefficients[0] != 0) {
        System.out.print(coefficients[0]);
        firstPrint = true;
    }
    for (int i = 1 ; i < MAX_NUMBER_OF_COEFFICIENTS; i ++) {
        if (coefficients[i] != 0) {
            if (firstPrint == false) {
                System.out.print(coefficients[i] + "x^" + i);
                firstPrint = true;
            }
            else {
                System.out.print(" + " + coefficients[i] + "x^" + i);
            }
        }
    }
    System.out.println();
}

public static void main(String[] args) {

    Polynomial p1 = new Polynomial(1,1);
    Polynomial p2 = new Polynomial(2,3);
    Polynomial p3 = new Polynomial();
    Polynomial p4 = new Polynomial();
    Polynomial p5 = new Polynomial(6,3);

    try {
        p1.insert(3,5);
        p1.sub(5,8);
        p1.printout();
        p2.sub(4,5);
        p2.add(new Polynomial(2,7));
        p2.printout();
        p3 = p1.add(p2);
        p3.printout();
        p4 = p1.sub(p2);
        p4.printout();
        p5.insert(2,5);
        p5.remove(3);
        p5.printout();
        //p1.add(new Polynomial(2,-1));
    }
    catch (ArrayIndexOutOfBoundsException e) {
            System.out.println("Exponent cannot be negative. " + e);
    }
}
}

3 个答案:

答案 0 :(得分:2)

该功能正在按预期工作。您不知道(可能是您)的是,当您致电p3 = p1.add(p2);时,您将更改p1,然后返回带有p1系数的新多项式。因此,当您致电p4 = p1.sub(p2)时,您将拥有与p1之前相同的p3 = p1.add(p2)。 所以你所拥有的更像是这样:

p3 = p1* = p1 + p2

p4 = p1** = p1* - p2

p1*的结果为p1 + p2。所以你现在拥有的是:

p4 = p1* - p2 = (p1 + p2) - p2 = p1

同样,如果你想返回新的多项式,不要改变现有的多项式。

更改功能add(Polynomial ..)sub(Polynomial ..)

public Polynomial add(Polynomial otherPolynomial) {
    int coeff[] = new int[MAX_NUMBER_OF_COEFFICIENTS];
    System.arraycopy(this.coefficients, 0, coeff, 0, MAX_NUMBER_OF_COEFFICIENTS);
    for (int i = 0 ; i < MAX_NUMBER_OF_COEFFICIENTS; i++) {
        // why is this anyway?
        //if (otherPolynomial.coefficients[i] != 0)
        coeff[i] += otherPolynomial.coefficients[i];
    }
    return new Polynomial(coeff);
}

public Polynomial sub(Polynomial otherPolynomial) {
    int coeff[] = new int[MAX_NUMBER_OF_COEFFICIENTS];
    System.arraycopy(this.coefficients, 0, coeff, 0, MAX_NUMBER_OF_COEFFICIENTS);
    for (int i = 0 ; i < MAX_NUMBER_OF_COEFFICIENTS; i++) {
        // why is this anyway?
        //if (otherPolynomial.coefficients[i] != 0)
        coeff[i] -= otherPolynomial.coefficients[i];
    }
    return new Polynomial(coeff);
}

这样,在分配(或调用复制构造函数)p1p3时,您不会更改p4

编辑: 根据你的代码,一个函数一旦添加到原始调用者并且一旦不改变它就是不可能的,这是你的程序想要的。当您致电p2.add(new Polynomial(2,7));时,您想要更改p2,同时您希望p1.add(p2)不要更改p1,这在一个功能中是无法实现的。

如果您想获得问题中建议的输出,请更改

p2.add(new Polynomial(2,7));

p2 = p2.add(new Polynomial(2,7));

EDIT2:如果我想这样做,我会以一种完全不同的方式做到这一点。我会使用add/subvoid函数返回类型,并且有两个静态add/sub函数返回新的Polynomial并接受two Polynomials。这些static方法无法在实例上调用(如p1),但只能在类上调用。

因此,如果我正在设计它,这将是我的代码:

public static Polynomial add(Polynomial p1, Polynomial p2){
    Polynomial newPolynomial = new Polynomial();
    for(int i=0;i< MAX_NUMBER_OF_COEFFICIENTS;i++)
    newPolynomial.coefficients[i] = p1.coefficients[i]+p2.coefficients[i];
    return newPolynomial;
}

public static Polynomial sub(Polynomial p1, Polynomial p2){
    Polynomial newPolynomial = new Polynomial();
    for(int i=0;i< MAX_NUMBER_OF_COEFFICIENTS;i++)
        newPolynomial.coefficients[i] = p1.coefficients[i]-p2.coefficients[i];
    return newPolynomial;
}

public void add(Polynomial otherPolynomial) {
    for (int i = 0 ; i < MAX_NUMBER_OF_COEFFICIENTS; i++) {
        coefficients[i] += otherPolynomial.coefficients[i];
    }
}

public void sub(Polynomial otherPolynomial) {
    for (int i = 0 ; i < MAX_NUMBER_OF_COEFFICIENTS; i++) {
        coefficients[i] -= otherPolynomial.coefficients[i];
    }
}

当你这样做时,你不能说p3.add(p1, p2)。这会将您的主要代码更改为:

    p1.insert(3,5);
    p1.sub(5,8);
    p1.printout();
    p2.sub(4,5);
    p2.add(new Polynomial(2,7));
    p2.printout();
    p3 = Polynomial.add(p1, p2);
    p3.printout();
    p4 = Polynomial.sub(p1, p2);
    p4.printout();
    p5.insert(2,5);
    p5.remove(3);
    p5.printout();

正如您所看到的p3p4,您将调用Polynomial.addPolynomial.sub。您可以通过了解Math.*方法来最好地理解这一点。所有Math库都是static,因此您无法创建它的实例,但您可以说Math.abs ...这里的概念相同,您可以调用Polynomial.add和等等

答案 1 :(得分:1)

在你的代码中,你混合了两个概念。

1)(不可变对象)要么将多项式编码为不可变,即add和sub不会改变成员字段,而是创建一个新数组并返回一个新对象 - 在这种情况下你必须写

Polynomial p3 = p1.add(p2)

和p1保持不变 - 或

2)(可变对象)你应该将你的多项式编码为可变并返回这个(并且不创建一个返回一个新对象) - 在这种情况下你可以写

p1.add(p2)

,类似于案例1中的p1 = p1.add(p2)。

如果是2)你可以做到

  p1.add(p2).sub(p3)

类似于 p1 = p1.add(p2).sub(p3),情况1)。

您正在观察的内容称为 副作用 ,因为您的操作正在修改对象。避免副作用可能是编写使对象不可变的代码的主要动机之一。

尝试

public Polynomial add(Polynomial otherPolynomial) {
    Polynomial result = new Polynomial();
    for (int i = 0 ; i < MAX_NUMBER_OF_COEFFICIENTS; i++) {
        if (otherPolynomial.coefficients[i] != 0)
            result.coefficients[i] = this.coefficients[i] + otherPolynomial.coefficients[i];
    }
    return result;
}

和sub。相似。

搜索关键字immutable,mutable和side effect以获取更多详细信息。

答案 2 :(得分:0)

看起来很好,你从行

开始
Polynomial p1 = new Polynomial(1,1);

这基本上是1 * x然后你调用以下行

p1.insert(3,5);

将数组的索引5设置为3,所以现在你有1 * x + 3x ^ 5,最后你打电话

p1.sub(5,8);

从数组的8索引中的值中减去5,现在就可以了 1x ^ 1 + 3x ^ 5 + -5x ^ 8

相关问题