反向数组,为什么当我除以 2 时有效?

Reverse array, why does is work when I divide by 2?

我有下面这段代码,它向后写了一个词,除了 for 循环中的一个小细节,我什么都懂:for (int i = 0; i < numberOfChars /2; i++)。 “/2”有什么作用?为什么它只能与它一起使用?

#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <string.h>
#include <time.h> // time


void reverse(char array[], int numberOfChars) {

    for (int i = 0; i < numberOfChars /2; i++) {
        char tmp;

        tmp = array[i];
        array[i] = array[numberOfChars - i - 1];
        array[numberOfChars - i - 1] = tmp;

    }
}


int main(void) {

    char word[55];
    int howMany;

    printf("Please enter a word:\n");
    scanf_s("%s", word, sizeof(word));
    printf("how many char do you want to reverse?\n");
    scanf_s("%d", &howMany);

    reverse(word, howMany);

    printf("New arr:%s\n", word);


    return 0;
}

因为使用此代码,您将开头放在末尾,将结尾放在字符串的开头。因此,当您 运行 一半 "howMany" 字符的用户想要更改时,它已经完全更改了。

正如 Ryan 在评论中指出的那样,如果您不包含 /2,数组中的每个位置都会交换两次,然后直接回到开始的位置。例如,如果您有 5 个元素,它会这样做:

  swap 0 with 4
  swap 1 with 3
  swap 2 with 2
  swap 3 with 1
  swap 4 with 0

顺便说一下,如果您使用两个索引而不是一个索引来遍历数组,我认为这段代码会变得更清晰:

int i=0;
int j=numberOfChars-1;
while(i < j){
    char tmp = array[i];
    array[i] = array[j];
    array[j] = tmp;
    i++;
    j--;
}

除法将数组减半。当您跟踪算法时,它会从左侧交换一个,另一个从右侧交换。对于均匀大小,交换每个数字。对于奇数大小,除了中间的那个留在同一个地方外,其他都和偶数一样。当我遇到算法时,我用纸和笔来解决它。因为获取其逻辑的方式更有效。 Here 是描述的解释。 因此,如果不是减半,先反转到数组的一半,然后再反转,保持原顺序。