You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 07:33:03