设置复杂系数数组,避免前导零
Setting up array of complex coefficients, avoiding the leading zero's
我为复数创建了一个 class:
public class Complex {
private double x; //Real part x of the complex number x+iy.
private double y; //Imaginary part y of the complex number x+iy.
public Complex(double x, double y) { //Constructor: Initializes x, y.
this.x=x;
this.y=y;
}
public Complex(double x) { //Real constructor - initialises with a real number.
this(x, 0.0);
}
public Complex() { //Default constructor; initialiase x and y to zero.
this(0.0, 0.0);
}
}
我想做的是创建一个函数 Polynomial,它会接受一个系数数组,然后对其进行过滤,例如 [1,0,0,1,0,0,0,0, 0...],它将 return 一个长度为 4 的数组。由于剩下的零在多项式中没有用处。
这是一个复杂数组的样子
Complex [] coeff = new Complex [] {
new Complex(-1.0 ,0.0), new Complex(),
new Complex() , new Complex(1.0, 0.0)
};
多项式定义为
Polynomial p = new Polynomial(coeff);
问题的表述如下:
这是多项式的样子,输入复数组系数
我正在考虑构建一个算法,该算法搜索零序列的第一个零(直到数组末尾),然后删除零。
我也在考虑反转数组的条目,这样 [0,1,1,0,1,0,0,0] 就会是 [0,0,0,1,0,1, 1,0] 然后创建一个函数,该函数将从第一个非平凡条目开始 "recording" 我的新数组。
我将如何创建这样的函数?
我的尝试是:
int j=0;
for(int i=coeff.length-1; i>=0; i-=1)
{
if(coeff[i].getReal()== 0 && coeff[i].getImag() == 0 ){
j=+1;
}
else {
break;
}
}
int a = coeff.length-j;
this.coeff = new Complex[a];
for (int i=0;i<this.coeff.length;i+=1){
this.coeff[i]=coeff[i];
}
}
例如我想打印:
Complex a1=new Complex(-3, 1);
Complex a2=new Complex(2, 0.3);
Complex a3=new Complex();
Complex b=new Complex();
Complex[] com=new Complex[] {a1,b, a2, a3,b};
输出为:
(-3.0+1.0i)+ (0.0+0.0i)X^1+(2.0+0.3i)X^2+(0.0+0.0i)X^3
但应该是:
(-3.0+1.0i)+ (0.0+0.0i)X^1+(2.0+0.3i)X^2
我试过给 int a = coeff 添加一个“-1”。length-j; :
int a = coeff.length-j-1;
但是如果我打印出来
Complex[] com=new Complex[] {a1,b, a2, a3,b,b,b,b,b,b};
它会给我相同的结果(即存储平凡系数)。
如何让构造函数不存储那些微不足道的系数?
这可以使用类似以下内容相对容易地完成:
int effective_len(Complex coeff[]) {
int pos = 0;
Complex zero();
for (int i=0; i<coeff.lengh; i++) {
if (!zero.equals(coeff[i])) {
pos = i;
}
}
return pos + 1;
}
为此,您需要定义 equals
方法,您只需在其中检查实部和虚部,但这应该可以让您到达需要去的地方。
我认为进入这里的方法是从头到尾遍历数组,就像您尝试的那样。您的代码的问题是下一个:
if(coeff[i].getReal()== 0 && coeff[i].getImag() == 0 ){
j=+1; //Here! I think you wanted to do j+=1
}
在执行 j=+1 时,您使 j 的值始终为 1。因此,将 j=+1 更改为 j+=1 将解决此问题。
另外,如果你想检查一下,我做了一个不同的代码。最后,它的作用相同,但我认为更清洁。
public class Polynomial {
private Complex[] coeff;
public Polynomial(Complex[] coeff) {
this.coeff = cleanCoeff(coeff);
}
private Complex[] cleanCoeff(Complex[] coeff) {
int length = coeff.length;
Complex complex = null;
for (int i = coeff.length - 1; i >= 0 ; i--) {
complex = coeff[i];
if(complex.getX() == 0 && complex.getY() == 0) {
length--;
}else {
break;
}
}
return Arrays.copyOf(coeff, length);
}
public Complex[] getCoeff() {
return coeff;
}
}
希望这个回答对您有所帮助。
我为复数创建了一个 class:
public class Complex {
private double x; //Real part x of the complex number x+iy.
private double y; //Imaginary part y of the complex number x+iy.
public Complex(double x, double y) { //Constructor: Initializes x, y.
this.x=x;
this.y=y;
}
public Complex(double x) { //Real constructor - initialises with a real number.
this(x, 0.0);
}
public Complex() { //Default constructor; initialiase x and y to zero.
this(0.0, 0.0);
}
}
我想做的是创建一个函数 Polynomial,它会接受一个系数数组,然后对其进行过滤,例如 [1,0,0,1,0,0,0,0, 0...],它将 return 一个长度为 4 的数组。由于剩下的零在多项式中没有用处。
这是一个复杂数组的样子
Complex [] coeff = new Complex [] {
new Complex(-1.0 ,0.0), new Complex(),
new Complex() , new Complex(1.0, 0.0)
};
多项式定义为
Polynomial p = new Polynomial(coeff);
问题的表述如下:
这是多项式的样子,输入复数组系数
我正在考虑构建一个算法,该算法搜索零序列的第一个零(直到数组末尾),然后删除零。
我也在考虑反转数组的条目,这样 [0,1,1,0,1,0,0,0] 就会是 [0,0,0,1,0,1, 1,0] 然后创建一个函数,该函数将从第一个非平凡条目开始 "recording" 我的新数组。
我将如何创建这样的函数?
我的尝试是:
int j=0;
for(int i=coeff.length-1; i>=0; i-=1)
{
if(coeff[i].getReal()== 0 && coeff[i].getImag() == 0 ){
j=+1;
}
else {
break;
}
}
int a = coeff.length-j;
this.coeff = new Complex[a];
for (int i=0;i<this.coeff.length;i+=1){
this.coeff[i]=coeff[i];
}
}
例如我想打印:
Complex a1=new Complex(-3, 1);
Complex a2=new Complex(2, 0.3);
Complex a3=new Complex();
Complex b=new Complex();
Complex[] com=new Complex[] {a1,b, a2, a3,b};
输出为:
(-3.0+1.0i)+ (0.0+0.0i)X^1+(2.0+0.3i)X^2+(0.0+0.0i)X^3
但应该是:
(-3.0+1.0i)+ (0.0+0.0i)X^1+(2.0+0.3i)X^2
我试过给 int a = coeff 添加一个“-1”。length-j; :
int a = coeff.length-j-1;
但是如果我打印出来
Complex[] com=new Complex[] {a1,b, a2, a3,b,b,b,b,b,b};
它会给我相同的结果(即存储平凡系数)。
如何让构造函数不存储那些微不足道的系数?
这可以使用类似以下内容相对容易地完成:
int effective_len(Complex coeff[]) {
int pos = 0;
Complex zero();
for (int i=0; i<coeff.lengh; i++) {
if (!zero.equals(coeff[i])) {
pos = i;
}
}
return pos + 1;
}
为此,您需要定义 equals
方法,您只需在其中检查实部和虚部,但这应该可以让您到达需要去的地方。
我认为进入这里的方法是从头到尾遍历数组,就像您尝试的那样。您的代码的问题是下一个:
if(coeff[i].getReal()== 0 && coeff[i].getImag() == 0 ){
j=+1; //Here! I think you wanted to do j+=1
}
在执行 j=+1 时,您使 j 的值始终为 1。因此,将 j=+1 更改为 j+=1 将解决此问题。
另外,如果你想检查一下,我做了一个不同的代码。最后,它的作用相同,但我认为更清洁。
public class Polynomial {
private Complex[] coeff;
public Polynomial(Complex[] coeff) {
this.coeff = cleanCoeff(coeff);
}
private Complex[] cleanCoeff(Complex[] coeff) {
int length = coeff.length;
Complex complex = null;
for (int i = coeff.length - 1; i >= 0 ; i--) {
complex = coeff[i];
if(complex.getX() == 0 && complex.getY() == 0) {
length--;
}else {
break;
}
}
return Arrays.copyOf(coeff, length);
}
public Complex[] getCoeff() {
return coeff;
}
}
希望这个回答对您有所帮助。