Java数组运算代码无语法报错但运行异常,请求排查解决
问题排查:Java多项式乘法代码结果不符合预期
看起来你是想实现多项式乘法的功能对吧?就是把两个多项式的系数数组相乘,得到结果数组。咱们来一步步拆解代码里的问题:
核心逻辑错误
你代码里的双层循环部分犯了一个索引使用的低级错误:
for (int k = 0; k < p1.length; k++) { for (int j = 0; j < p2.length; j++) { Array[j + k] += (p1[j] * p2[j]); // 这里的p1[j]完全用错了! } }
多项式乘法的逻辑应该是:用p1的第k个元素乘以p2的第j个元素,然后把乘积累加到结果数组的k+j位置(对应多项式中x^(k+j)的系数)。但你写成了p1[j] * p2[j],这意味着不管外层循环的k取什么值,内层循环都只会取p1的前p2.length个元素去乘p2的对应元素,完全偏离了正确逻辑。
正确的写法应该是:
Array[k + j] += p1[k] * p2[j];
隐藏的数组长度错误
你代码里结果数组的长度设置也有问题:
int maxlentharr; if (p1.length > p2.length) { maxlentharr = p1.length; } else { maxlentharr = p2.length; } double[] Array = new double[maxlentharr];
多项式乘法的结果数组长度应该是p1.length + p2.length - 1(比如3个元素的数组和2个元素的数组相乘,结果应该是4个元素),而不是两个输入数组的最大长度。原代码的长度设置会导致最后一个系数无法存储,这也是结果不符合预期的关键原因之一。
可以删掉的冗余代码
你代码里初始化数组的循环是完全多余的:
for (int i = 0; i < Array.length; i++) { Array[i] = 0; }
在Java中,当你用new double[length]创建数组时,所有元素会被自动初始化为0.0,所以这段循环直接删掉就行,不会影响任何结果。
修正后的完整代码
public class test { public static void main(String[] args) { double[] p1={2,3,4}; double[] p2={2,3}; // 修正结果数组的长度 double[] Array = new double[p1.length + p2.length - 1]; for (int k = 0; k < p1.length; k++) { for (int j = 0; j < p2.length; j++) { // 修正索引逻辑 Array[k + j] += p1[k] * p2[j]; } } for (double element: Array) { System.out.println("------------------"); System.out.println(element); } } }
修正后的运行结果
运行上面的代码,你会得到符合预期的输出:
------------------ 4.0 ------------------ 12.0 ------------------ 17.0 ------------------ 12.0
这个结果对应多项式2+3x+4x²乘以2+3x的正确展开式:4 + 12x +17x² +12x³。
内容的提问来源于stack exchange,提问作者loai shark
相关产品推荐
相关产品推荐

