您好,我需要检查数组是否对称。我有一个函数,它接受整数 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;
}
最佳答案
几个问题:
根据您的定义,矩阵是对称的当且仅当它等于其转置。这可能仅适用于方阵,但您也可以无缘无故地适应非方阵。
您的
symmetry2D()
函数包含严重的逻辑缺陷:它通过执行
的循环使输入对称/li>M[h][k] = M[k][h]
即使它不这样做,它也永远不会发现输入是非对称的,因为它对此的测试是
if (M[h][k] != M[h][k ])
,它必须始终失败。
不清楚您认为
if
/else
和symmetry2D()
末尾的循环嵌套为您实现了什么, 但前提是rowSize
和colSize
都大于零,整个构造的实际效果与简单的相同返回结果;
.
看起来这个想法可能是创建一个包含输入转置的数组,然后将输入与它进行比较。那会奏效,尽管效率低得离谱,但实际上您永远不会为转置创建单独的数组。如果您打算在不创建转置的情况下进行测试——您应该这样做——那么
不要修改输入数组(因此完全移除第一个循环嵌套)。
为对称比较获取正确的索引:
M[h][k] != M[k][h]
为获得最佳效率,请避免冗余和不必要的比较。例如,如果您已经测试了
M[1][2] == M[2][1]
那么您就不需要测试是否M[2][1] == M[1][2]
。而且您永远不需要测试主对角线上的元素。通过更好地选择循环边界,您可以很容易地实现这种效率。
此外,如果确实 symmetry2D()
函数应该避免修改输入数组,请考虑将其第一个参数的元素类型声明为 const int
而不是plain int
(但不要修改main()
中相应变量的类型)。如果您一开始就以这种方式编写它,那么编译器会注意到该函数试图修改数组元素的逻辑错误尝试,并拒绝该代码。
关于c - 查找数组中的对称性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46569091/