初级版本–开辟一个新数组(有点耗费内存了)
//【程序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菜的一批),欢迎大佬指出~