反向数组,为什么当我除以 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 是描述的解释。 因此,如果不是减半,先反转到数组的一半,然后再反转,保持原顺序。
我有下面这段代码,它向后写了一个词,除了 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 是描述的解释。 因此,如果不是减半,先反转到数组的一半,然后再反转,保持原顺序。