C语言--指针--【程序40】 题目:有n个整数,使其前面各数顺序向后移m个位置,最后m个数变成最前面的m个数

初级版本–开辟一个新数组(有点耗费内存了)

//【程序40】
//题目:有n个整数,使其前面各数顺序向后移m个位置,最后m个数变成最前面的m个数
#include<stdio.h>
int main()
{
    
    
	int n,m,i,j,a[20],b[20]; //初级版本 --开辟一个新数组 
	scanf("%d %d",&n,&m);
	for(i=0;i<n;i++)
		scanf("%d",&a[i]);
	for(i=n-m,j=0;i<n;i++)
	{
    
    
		b[j++]=a[i];
	}
	for(i=0;i<n-m;i++)
	{
    
    
		b[j++]=a[i];
	}
	for(i=0;i<n;i++)
		printf("%d ",b[i]);
	return 0;
} 

高级版本–指针–用递归实现–循环后移

不熟悉指针的小伙伴,先看一下这个用数组写的思想:实质就是每调用一次,就有数组中最后一个元素提到数组首元素位置,其余元素依次后移一位,用递归实现调用即可。注意用m来控制递归调用的次数。
比如:
输入:
8 3
1 2 3 4 5 6 7 8

递归调用1次(m=3)的结果为:
8 1 2 3 4 5 6 7
递归调用2次(m=2)的结果为:
7 8 1 2 3 4 5 6
递归调用3次(m=1)的结果为:
6 7 8 1 2 3 4 5
此时m=0,返回输出。

思路表达:

	str_end=str[n-1];      //数组写法 
	for(int i=n-1;i>0;i--)
		str[i]=str[i-1];      // 每个都后移一位
	str[0]=str_end;

正式写法:

#include<stdio.h>

int* move(int str[],int n,int m)
{
    
    
	int *p,str_end;
	
	if(m>0) 
	{
    
    
		str_end=*(str+n-1);
		for(p=str+n-1;p>str;p--)
			*p=*(p-1);      // 每个都后移一位 
		*p=str_end;
		
		m--;
	}
		
	if(m>0)
		move(str,n,m); //递归,循环后移 
	else
		return p;
}

int main()
{
    
    
	int a[20],i,m,n;
	scanf("%d %d",&n,&m);
	for(i=0;i<n;i++)
		scanf("%d",&a[i]);
	move(a,n,m);
	for(i=0;i<n;i++)
		printf("%d ",a[i]);
	return 0; 
}

输入:

8 3
1 2 3 4 5 6 7 8

输出:

6 7 8 1 2 3 4 5

要是有错误(me菜的一批),欢迎大佬指出~

猜你喜欢

转载自blog.csdn.net/xiaoyue_/article/details/105274417
今日推荐