user-0 提问: 数组逆序代码求教

回复:
user: user-1
content: 个数为奇数的时候，中间那个根本就不用处理，所以直接  i<N/2 就可以了

user: user-2
content: #include<iostream> using namespace std;  // 打印 void printArr(int *arr, int len) {     int i = 0;     for (i=0; i<len; i++) {         cout << arr[i] << " ";           }     cout << endl; }   // 反转数组 void reverse(int *arr, int len) {     int i = 0;     int n = len/2;      for (i = 0; i<n; i++) {         int tmp = arr[i];         arr[i] =  arr[len-i-1];         arr[len-i-1] = tmp;     } }  int main() {     int arr[] = {4,1,9,2,10,0};     int len = sizeof(arr)/sizeof(int);     int n = len / 2;     int i = 0;      printArr(arr, len);      reverse(arr, len);      cout << "逆序后的结果是：" << endl;     printArr(arr, len);      return 0; }

user: user-3
content: 1.原代码中变量j未使用，会有warning一处，可删除变量j； 2.原代码中只有当i=0时发生了交换，可将2修改为2.0. 新代码： #define N 5 #include<stdio.h> void main() { 	int nums[N]={16,25,9,90,23}; 	int i,temp; 	for(i=0;i<=N/2.0-1;i++) 	{ 		temp=nums[i]; 		nums[i]=nums[N-i-1]; 		nums[N-i-1]=temp; 	} 	printf("逆序后的结果是:\n"); 	for(i=0;i<N;i++) 		printf("%d  ",nums[i]); 	    printf("\n"); }

user: user-4
content: 引用 7 楼 hdt 的回复:[quote=引用 6 楼 cfjtaishan 的回复:] 注意考虑到N是奇数是的问题。  for (i = 0; i < N / 2; i++) 偶数也是一样。 证明如下 一个序列是偶数 N 可以表示为 2M; 从1开始计数的话是 1,2,3....m,m+1...2m; 1到m的数量与m+1到2m的数量一致。 因为c++/c数组是从0开始计数，所以上边的序列依次减1 ，0，1，2。。。。m-1,m......2m-1 所以程序循环是从 0到 m-1; m=N/2  for( int i=0;i<m/2;i++)====>for(int i=0;i<N/2;i++)  以下留作业，证明 N为奇数上题循环依然是 for( int i=0;i<N/2;i++) [/quote] 偶数好说，主要是奇数的情况

user: user-5
content: 正如楼上几位朋友所说，把交换数组元素位置的for循环代码改为 for (i = 0; i < N / 2; i++) 即可，此时无需考虑N是奇数还是偶数，如下图所示  可以看出，无论N是奇数还是偶数，交换N/2次即可实现数组的逆序

user: user-6
content: 引用 14 楼 cfjtaishan 的回复:[quote=引用 7 楼 hdt 的回复:] [quote=引用 6 楼 cfjtaishan 的回复:] 注意考虑到N是奇数是的问题。  for (i = 0; i < N / 2; i++) 偶数也是一样。 证明如下 一个序列是偶数 N 可以表示为 2M; 从1开始计数的话是 1,2,3....m,m+1...2m; 1到m的数量与m+1到2m的数量一致。 因为c++/c数组是从0开始计数，所以上边的序列依次减1 ，0，1，2。。。。m-1,m......2m-1 所以程序循环是从 0到 m-1; m=N/2  for( int i=0;i<m/2;i++)====>for(int i=0;i<N/2;i++)  以下留作业，证明 N为奇数上题循环依然是 for( int i=0;i<N/2;i++) [/quote] 偶数好说，主要是奇数的情况[/quote] 真是没办法，什么东西都要讲透了，才能明白？不知道举一反三吗？ 设 N 为奇数，基数可以表示为2m+1； 序列的下标为 1，2，3,....m,m+1,m+2.....2m+1; 可以知道 1到m ,和 m+2到 2m+1 数量相同。 c/c++ 数组从0开始计数 所以 上边序列计数为 0，1，2，3...m-1,m,m+1......2m; 要把上述序列依此对调，所以循环为 for( int i=0;i<m;i++)   又知 x 为整型情况下 c/c++ (2*x+1)/2 = x m = (2m+1)/2 2m+1=N 因此 循环为 for(int i=0;i<N/2;i++)

user: user-7
content: 代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。

user: user-0
content: 引用 2 楼 zhangchm2018 的回复：[quote=引用 1 楼 zhangchm2018 的回复:] for (i = 0; i < (N / 2.0 - 1); i++) / 左右两边都是 int，结果为 int，5 / 2 = 2 / 左右两边有一个是 double，结果自动转换为 double，5 / 2 = 2.5[/quote]感谢

user: user-8
content: 引用 1 楼 zhangchm2018 的回复:for (i = 0; i < (N / 2.0 - 1); i++) / 左右两边都是 int，结果为 int，5 / 2 = 2 / 左右两边有一个是 double，结果自动转换为 double，5 / 2 = 2.5

user: user-8
content: for (i = 0; i < (N / 2.0 - 1); i++)

user: user-0
content: 引用 10 楼 真相重于对错 的回复：[quote=引用 9 楼 zhangchm2018 的回复:] [quote=引用 3 楼 qq_38786775 的回复:] [quote=引用 2 楼 zhangchm2018 的回复：][quote=引用 1 楼 zhangchm2018 的回复:] for (i = 0; i < (N / 2.0 - 1); i++) / 左右两边都是 int，结果为 int，5 / 2 = 2 / 左右两边有一个是 double，结果自动转换为 double，5 / 2 = 2.5[/quote]感谢[/quote] 想了想偶数的情况，应该 for (i = 0; i <= (N / 2.0 - 1); i++)[/quote] 看我上边的证明[/quote]感谢

user: user-6
content: 引用 9 楼 zhangchm2018 的回复:[quote=引用 3 楼 qq_38786775 的回复:] [quote=引用 2 楼 zhangchm2018 的回复：][quote=引用 1 楼 zhangchm2018 的回复:] for (i = 0; i < (N / 2.0 - 1); i++) / 左右两边都是 int，结果为 int，5 / 2 = 2 / 左右两边有一个是 double，结果自动转换为 double，5 / 2 = 2.5[/quote]感谢[/quote] 想了想偶数的情况，应该 for (i = 0; i <= (N / 2.0 - 1); i++)[/quote] 看我上边的证明

user: user-8
content: 引用 3 楼 qq_38786775 的回复:[quote=引用 2 楼 zhangchm2018 的回复：][quote=引用 1 楼 zhangchm2018 的回复:] for (i = 0; i < (N / 2.0 - 1); i++) / 左右两边都是 int，结果为 int，5 / 2 = 2 / 左右两边有一个是 double，结果自动转换为 double，5 / 2 = 2.5[/quote]感谢[/quote] 想了想偶数的情况，应该 for (i = 0; i <= (N / 2.0 - 1); i++)

user: user-6
content: 引用 7 楼 hdt 的回复:[quote=引用 6 楼 cfjtaishan 的回复:] 注意考虑到N是奇数是的问题。  for (i = 0; i < N / 2; i++) 偶数也是一样。 证明如下 一个序列是偶数 N 可以表示为 2M; 从1开始计数的话是 1,2,3....m,m+1...2m; 1到m的数量与m+1到2m的数量一致。 因为c++/c数组是从0开始计数，所以上边的序列依次减1 ，0，1，2。。。。m-1,m......2m-1 所以程序循环是从 0到 m-1; m=N/2  for( int i=0;i<m/2;i++)====>for(int i=0;i<N/2;i++)  以下留作业，证明 N为奇数上题循环依然是 for( int i=0;i<N/2;i++) [/quote] for( int i=0;i<m;i++)====>for(int i=0;i<N/2;i++)

user: user-6
content: 引用 6 楼 cfjtaishan 的回复:注意考虑到N是奇数是的问题。  for (i = 0; i < N / 2; i++) 偶数也是一样。 证明如下 一个序列是偶数 N 可以表示为 2M; 从1开始计数的话是 1,2,3....m,m+1...2m; 1到m的数量与m+1到2m的数量一致。 因为c++/c数组是从0开始计数，所以上边的序列依次减1 ，0，1，2。。。。m-1,m......2m-1 所以程序循环是从 0到 m-1; m=N/2  for( int i=0;i<m/2;i++)====>for(int i=0;i<N/2;i++)  以下留作业，证明 N为奇数上题循环依然是 for( int i=0;i<N/2;i++)

user: user-4
content: 注意考虑到N是奇数是的问题。  for (i = 0; i < N / 2; i++)

user: user-9
content: 用STL最方便  #include <iostream> #include <list> #include <algorithm> #include <iterator> using namespace std; int main() { 	list<int> a{1,2,3,4,5,6}; 	reverse(a.begin(),a.end()); 	ostream_iterator<int> it(cout," "); 	copy(a.begin(),a.end(),it); }  输出：  6 5 4 3 2 1 按 <RETURN> 来关闭窗口...

user: user-6
content: for (i = 0; i < N / 2; i++) {      }