检查C中的数组是否对称

时间:2015-03-08 06:08:31

标签: c arrays

我正在研究一个示例问题,它要求我检查用户输入的数组是否对称。我已经想出了如何通过创建另一个数组来做到这一点,以相反的顺序复制第一个数组,然后检查它们是否相互相等。如下面的代码所示。

#include <stdio.h>

int main(void){

#define NUM_ELEMENTS 12
int userArray[NUM_ELEMENTS];
int userArray2[NUM_ELEMENTS];
int i;
int tempVal = 0;
double sumArray = 0;
double aveArray = 0;


printf("Enter 12 interger numbers (each one separated by a space):\n");
for(i = 0; i < NUM_ELEMENTS; i++){
    scanf_s("%d", &userArray[i]);
}

for(i = 0; i < NUM_ELEMENTS; i++){
    sumArray = sumArray + userArray[i];
}

aveArray = sumArray/NUM_ELEMENTS;

printf("\nAverage of all data points is %.2lf \n",aveArray);
printf("\nAn array in reverse order:\n");

for(i = NUM_ELEMENTS - 1; i >= 0; i--){
    printf("%d ",userArray[i]);
}
printf("\n");

//Used swap values in the array
for(i = 0; i < (NUM_ELEMENTS / 2); i++){
    tempVal = userArray[i];
    userArray2[i] = userArray[NUM_ELEMENTS - 1- i];
    userArray2[NUM_ELEMENTS - 1 - i] = tempVal;
}
if(userArray[i] == userArray2[i])
    printf("\nThis array is symmetric\n");
else
    printf("\nThis array is NOT symmetric\n");

    return 0;
}

因此,如果用户输入1 2 3 4 5 6 6 5 4 3 2 1,则程序返回该阵列是对称的。

我只是好奇是否有更简单的方法可以做到这一点?

3 个答案:

答案 0 :(得分:2)

同时向前和向后迭代:

// i iterates forwards from the start
// j iterates backwards from the end
// once they pass each other, we're done.
for (int i = 0, j = NUM_ELEMENTS - 1; i < j; i++, j--) {
    if (userArray[i] != userArray[j]) {
        printf("\nThis array is not symmetric\n");
        return 0;  // No point in running this function any longer at this point.
    }
}

// If the function didn't return in the for loop, the array is symmetrical.
printf("\nThis array is symmetric\n");

答案 1 :(得分:0)

您可以从两侧遍历数组并比较元素:

int i;
int flag = 1;
for (i = 0; flag && i <= (NUM_ELEMENTS - 1) / 2); ++i) {
    if (userArray[i] != userArray[NUM_ELEMENTS - i]) {
        printf ("Array is not symmetric");
        flag = 0;
    }
}
if (flag) {
    printf ("Array is symmetric");
}

答案 2 :(得分:0)

就个人而言,在C中,我只是用指针来做。

int is_symmetric(const int *s, int num_elements)
{
     const int *begin = s, *end = s + num_elements - 1;
     while (begin < end)
     {
         if (*begin != *end) return 0;
         ++begin; --end;
     }
     return 1;
}