C语言将数组元素全体移动k次,这里以左移动为例。
#include <stdio.h>
#include<string.h>
#include<stdlib.h>
void reverse(int a[],int k,int n);
void leftMove(int a[],int k,int n);
int main()
{
int k, n, i, *arr;
printf("请问要输入几个整数?\n");
scanf("%d", &n);
//动态分配内存空间
arr = (int *)malloc(n*sizeof(int));
printf("请输入%d个整数:\n",n);
for(i = 0; i < n; i++){
scanf("%d", arr+i);
}
printf("请问要左移动几次?\n");
scanf("%d", &k);
/*
方法一的思路:
假设数组长度为n=6,位移k=3,a[]={1,2,3,4,5,6} ;
1,嵌套循环的内循环是数组整体左移动一个。{2,3,4,5,6,1}
2,外循环控制全部元素左移动个数 。{4,5,6,1,2,3}
*/
leftMove(arr,k,n);
/*
方法二的思路:
假设数组长度为n=6,位移k=3,a[]={1,2,3,4,5,6} ;
1,先逆置数组前K个元素; {3,2,1,4,5,6}
reverse(arr,0,k-1);
2,再逆置数组后n-k个 元素 ; {3,2,1,6,5,4}
reverse(arr,k,n-1);
3,最后逆置整个数组 {4,5,6,1,2,3}
reverse(arr,0,n-1);
*/
printf("左移动%d次后的数组为:\n",k);
for(i=0;i<n;i++){
if(i!=(n-1)){
printf("%d,",arr[i]);
}else{
printf("%d",arr[i]);
}
}
return 0;
}
void reverse(int a[],int start,int end){
int temp,i;
for(i=0;i<(end-start+1)/2;i++){
temp = a[start+i];
a[start+i] = a[end-i];
a[end-i] = temp;
}
}
void leftMove(int a[],int k,int n){
int i,j;
for(i = 0; i < k; i++)
{
int temp;
temp = a[0];
for(j = 0; j < n-1; j++)
a[j] = a[j+1];
a[n-1] = temp;
}
}