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菜的一批),欢迎大佬指出~

  • 24
    点赞
  • 61
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值