gpt4 book ai didi

java - Java 数组多项式加减法

转载 作者:行者123 更新时间:2023-12-01 20:56:59 24 4
gpt4 key购买 nike

我有下面的代码,一切似乎都工作正常,除了尝试从另一个多项式中减去一个多项式时的 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);
}
}
}

最佳答案

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

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);
}

这样,当您分配(或调用复制构造函数)p3p4 时,您就不会更改 p1

<小时/>

编辑:根据您的代码,不可能有一个函数一旦添加到原始调用者并且一旦不更改它,这正是您的程序想要的。当您调用 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:如果我想这样做,我真的会以完全不同的方式来做。我将拥有所有具有 void 返回类型的 add/sub 函数,并且有两个返回新 Polynomial< 的静态 add/sub 函数 并接受两个多项式。这些静态方法不能在实例上调用(如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 库都是静态,因此您无法创建它的实例,但您可以说 Math.abs...这里是相同的概念,你可以调用Polynomial.add等等

关于java - Java 数组多项式加减法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42198612/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com