栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

数组的循环右移问题(C语言)

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

数组的循环右移问题(C语言)


要求不能使用额外的数组,那我就申请两倍于数组元素个数大小的数组。。虽然这样好像不遵守题意,但我觉得本质上的思想是一样的。。所以也就凑活凑活了。。

#include
int main()
{
	int n,move,i,j;
	scanf("%d%d",&n,&move);
	int array[2*n];
	for(i = 0;i < n;i++){
		scanf("%d",&array[i]);
		array[n+i] = array[i];
	}
	j = n-move%n;
	for(i = 0;i < n;i++){
		printf("%d",array[j++]);
		if(i != n-1)	printf(" ");
	}
}

代码的思路可以用以下这个例子解释:
0 1 2 3 4 5(数组元素序号)
1 2 3 4 5 6 1 2 3 4 5 6(创建的两倍长度的数组)
6 1 2 3 4 5(移动一位)
5 6 1 2 3 4(移动两位)
可以看到当移动1位时,就是从第一个数组中的下标为5的元素开始往后输出6个元素
同理当移动2位时,从第一个数组中下标为4的元素开始往后输出6个元素
可以知道1+5=6,2+4=6
接下来只需要利用这个互补于长度的关系转化为代码就好了(再多考虑一下移动次数超过数组长度的可能,移动次数对长度取余就行了)

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/290327.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号