数组逆序代码求教

足够优秀 2018-08-25 11:33:55
确实找不到哪里出了问题,求大佬指教!感谢
...全文
505 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
老夏 2018-09-10
  • 打赏
  • 举报
回复
个数为奇数的时候,中间那个根本就不用处理,所以直接 i<N/2 就可以了
林de 2018-09-10
  • 打赏
  • 举报
回复
#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;
}
lijingswjtu 2018-09-09
  • 打赏
  • 举报
回复
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");
}
自信男孩 2018-08-27
  • 打赏
  • 举报
回复
引用 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]
偶数好说,主要是奇数的情况
棉猴 2018-08-27
  • 打赏
  • 举报
回复
正如楼上几位朋友所说,把交换数组元素位置的for循环代码改为
for (i = 0; i < N / 2; i++)

即可,此时无需考虑N是奇数还是偶数,如下图所示

可以看出,无论N是奇数还是偶数,交换N/2次即可实现数组的逆序
真相重于对错 2018-08-27
  • 打赏
  • 举报
回复
引用 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++)

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

足够优秀 2018-08-25
  • 打赏
  • 举报
回复
引用 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]感谢
zhangchm2018 2018-08-25
  • 打赏
  • 举报
回复
引用 1 楼 zhangchm2018 的回复:
for (i = 0; i < (N / 2.0 - 1); i++)

/ 左右两边都是 int,结果为 int,5 / 2 = 2
/ 左右两边有一个是 double,结果自动转换为 double,5 / 2 = 2.5
zhangchm2018 2018-08-25
  • 打赏
  • 举报
回复
for (i = 0; i < (N / 2.0 - 1); i++)
足够优秀 2018-08-25
  • 打赏
  • 举报
回复
引用 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]感谢
真相重于对错 2018-08-25
  • 打赏
  • 举报
回复
引用 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]
看我上边的证明
zhangchm2018 2018-08-25
  • 打赏
  • 举报
回复
引用 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++)
真相重于对错 2018-08-25
  • 打赏
  • 举报
回复
引用 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++)
真相重于对错 2018-08-25
  • 打赏
  • 举报
回复
引用 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++)
自信男孩 2018-08-25
  • 打赏
  • 举报
回复
注意考虑到N是奇数是的问题。

for (i = 0; i < N / 2; i++)
  • 打赏
  • 举报
回复
用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> 来关闭窗口...
真相重于对错 2018-08-25
  • 打赏
  • 举报
回复

for (i = 0; i < N / 2; i++)
{

}

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧