数组循环移位,有没有好心人帮忙看一下的

【问题描述】对数组前面的n个整数,各数循环顺序后移m个位置,最后m个数变成最前面m个数。             编写函数void fun(int *p,int n,int m),实现上述功能:对p指向的数组前n个数循环可移m位。             在main()中输入变量n与m,然后输出移位后的数组各数。 【输入形式】输入2个正整数n和m 【输出形式】对前n个数循环右移m位后,数组中全部20个数。 【样例输入1】Please input n and m:20 14 【样例输出1】7 8 9 10 11 12 13 14 15 16 17 18 19 20 1 2 3 4 5 6 【样例输入2】Please input n and m:10 14 【样例输出2】7 8 9 10 1 2 3 4 5 6 11 12 13 14 15 16 17 18 19 20 【样例输入3】Please input n and m:12 22 【样例输出3】3 4 5 6 7 8 9 10 11 12 1 2 13 14 15 16 17 18 19 20 【样例说明】输入的n值请小于等于20,m值为正整数 【部分代码】 #include "stdio.h" void fun(int *p,int n,int m) { } int main() { void fun(int *,int ,int );   int x[20]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20},i,m,n;   printf("Please input n and m:");   scanf("%d%d",&n,&m); fun(x,n,m); for(i=0;i<20;i++) printf("%d ",x[i]); printf("\n"); return 0; }

下面的解法空间复杂度是n,

最优解是原地打表, 空间复杂度1

void fun(int *p,int n,int m) {
	m = m%n;
	int tmp[n];
	if(0 == m){
		return;
	}
	for(int i=0; i<n; i++){
		tmp[(i+m)%n] = p[i];
	}
	for(int i=0; i<n; i++){
		p[i] = tmp[i];
	}
}

 

代码如下,如有帮助,请采纳一下,谢谢。

#include <iostream>
using namespace std;
void fun(char *p,int n,int m)
{
	char c;
	for (int j = 0; j < m;j++)
	{
		c = p[n-1];
		for (int i = n-1;  i > 0; i--)
		{
			p[i] = p[i-1];
		}
		p[0] = c;
	}

}
int main() 
{ 
	int i,m,n; 
	cin >> m >> n; 
	char *p =new char[n+1];
	p[n] = 0;
	for(i = 0; i < n; ++i) 
		cin >> p[i]; 
	fun(p,n,m); 
	for(i = 0; i < n; ++i) 
		cout << p[i] << ' '; 
	cout << endl; 
	delete [] p; 
	getchar();
	getchar();
	return 0;
}

 

您好,我是有问必答小助手,您的问题已经有小伙伴解答了,您看下是否解决,可以追评进行沟通哦~

如果有您比较满意的答案 / 帮您提供解决思路的答案,可以点击【采纳】按钮,给回答的小伙伴一些鼓励哦~~

ps:问答VIP仅需29元,即可享受5次/月 有问必答服务,了解详情>>>https://vip.csdn.net/askvip?utm_source=1146287632