我需要检查数组是否对称。我有一个函数,它接受一个整数M的二维数组和行和列的数组大小作为参数,如果M是对称的,则返回1,否则返回0。我尝试了很多次,但输出对非对称阵列是肯定的,对于对称阵列是否是
这是我的代码:
#include <stdio.h>
#define SIZE 10
#define INIT_VALUE -1
int symmetry2D(int M[][SIZE], int rowSize, int colSize);
int main()
{
int M[SIZE][SIZE], i, j, result = INIT_VALUE;
int rowSize, colSize;
printf("Enter the array size (rowSize, colSize): \n");
scanf("%d %d", &rowSize, &colSize);
printf("Enter the matrix (%dx%d): \n", rowSize, colSize);
for (i = 0; i < rowSize; i++)
for (j = 0; j < colSize; j++)
scanf("%d", &M[i][j]);
result = symmetry2D(M, rowSize, colSize);
if (result == 1)
printf("symmetry2D(): No\n");
else if (result == 0)
printf("symmetry2D(): Yes\n");
else
printf("Error\n");
return 0;
}
int symmetry2D(int M[][SIZE], int rowSize, int colSize)
{
int h, k, temp;
int result;
for (h = 0; h < rowSize; h++)
{
for (k = 0; k < colSize; k++)
{
M[h][k] = M[k][h];
}
}
result = 0;
for (h = 0; h < rowSize && result; h++)
{
for (k = 0; k < colSize; k++)
{
//if it is not equal to its transpose
if (M[h][k] != M[h][k])
{
result = 1;
break;
}
}
}
if (result == 0)
{
for (h = 0; h < rowSize; h++)
{
for (k = 0; k < colSize; k++)
{
return result = 0;
}
}
}
else
return result = 1;
}
答案 0 :(得分:2)
几个问题:
根据您的定义,当且仅当矩阵等于其转置时,矩阵才是对称的。只有方形矩阵才是这种情况,但你也可以使用非方形矩阵,没有明显的理由。
您的symmetry2D()
函数包含严重的逻辑缺陷:
通过执行M[h][k] = M[k][h]
即使它没有这样做,它也永远不会发现输入是非对称的,因为它的测试是if (M[h][k] != M[h][k])
,它必须总是失败。
目前还不清楚您认为if
/ else
和symmetry2D()
末尾的循环嵌套对您的影响是什么,但前提是rowSize
和{ {1}}大于零,整个构造的实际效果与简单colSize
相同。
看起来这个想法可能是创建一个包含输入转置的数组,然后将输入与之比较。这本来会有效,尽管它的效率相当低,但你实际上从来没有为转置创建单独的数组。如果你要在没有创建转置的情况下进行测试 - 你应该 - 然后
请勿修改输入数组(因此请完全删除第一个循环嵌套)。
为对称比较获取正确的索引:return result;
为了获得最佳效率,请避免冗余和不必要的比较。例如,如果您已经测试过M[h][k] != M[k][h]
,则无需测试M[1][2] == M[2][1]
。而且你永远不需要在主对角线上测试元素。通过更好地选择循环边界,您可以非常轻松地实现这种效率。
此外,如果M[2][1] == M[1][2]
函数确实应该避免修改输入数组,请考虑将其第一个参数的元素类型声明为symmetry2D()
而不是普通const int
(但是不修改int
)中相应变量的类型。如果您首先以这种方式编写它,那么编译器会注意到该函数在逻辑上错误地尝试修改数组元素,并拒绝了代码。