给定一个有n个元素的数组,使其整体左移m位(m<n),位于开头的就循环移至数组结尾。
方法一:用循环一个一个移动,不再赘述。
方法二:使用三次逆序。
把数组从位置m处分开成两截,前面一截和后面一截分别逆序,然后进行总逆序,即可达成目的。
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
int main(){
int m=0,n=0,i=0,e=0;
printf("请输入序列长度:");
scanf("%d",&n);
//定义数组并赋值
int *arr=(int*)malloc(n*sizeof(int));
if(!arr)
exit(0);
for(i=0;i<n;i++)
arr[i]=i+1;
//遍历原始数组
for(i=0;i<n;i++)
printf("%3d",arr[i]);
printf("\n");
printf("请输入移动位数:");
scanf("%d",&m);
//逆序前半段
for(i=0;i<m/2;i++){
e=arr[i];
arr[i]=arr[m-1-i];
arr[m-1-i]=e;
}
//逆序后半段
for(i=0;i<(n-m)/2;i++){
e=arr[m+i];
arr[m+i]=arr[n-1-i];
arr[n-1-i]=e;
}
//整体逆序
for(i=0;i<n/2;i++){
e=arr[i];
arr[i]=arr[n-1-i];
arr[n-1-i]=e;
}
//遍历操作后数组
for(i=0;i<n;i++)
printf("%3d",arr[i]);
printf("\n");
return 0;
}