数学运算顺序的算法

时间:2017-11-25 22:10:57

标签: c algorithm parsing math matrix

我的代码中存在实现数学运算顺序规则的问题。 我有2个阵列。矩阵数组(最多100个矩阵)和操作数组(最多99个操作)。这些操作只是矩阵的加法,减法和乘法(用+ - *表示)。

我的矩阵是一种结构,但这只是一个细节。我有关于他们的一切工作功能。

我还有一个执行操作的功能。

struct Matrix compute(struct Matrix mat1, struct Matrix mat2, char op)

该功能有一个开关,用于确定操作并执行正确的操作。

我需要改进的代码就是这一段。

// counter = number of matrices in the array
// therefore there's also counter-1 operations

struct Matrix temp = compute(matrices[0], matrices[1], operations[0]);
for(int j = 1; j < counter; ++j)
{
    temp = compute(temp, matrices[j+1], operations[j]);
}
get_matrix(temp); //outputs the matrix to stdout

目前,此代码正确评估了不包含乘法的所有矩阵序列和操作(假设输入正确且可以执行操作)。

我需要什么?我需要朝着正确的方向踢一脚。

1 个答案:

答案 0 :(得分:2)

一种简单的方法是遍历矩阵序列一次,并仅执行乘法运算。在应用乘法之后创建由矩阵组成的新序列。例如,如果初始序列是这样的

|A| * |B| + |C| * |D| * |E| - |F| + |G| * |H|

处理乘法后的序列如下所示:

|A*B| + |C*D*E| - |F| + |G*H|

这将删除序列中的所有乘法,从而引发您已经知道如何解决的问题。

注意:您的代码有一个错误:当j等于counter时,matrices[j+1]会引用一个结尾的元素matrices[]数组。

您可以通过检查循环内的j+1 < counter来解决此问题。另一种方法是将matrices[0]复制到temp,而不是执行超出范围的初始操作。通过这种方式,您可以从零开始j,以确保代码甚至可以用于单个矩阵的“退化”情况。