一个数组a中存有n(>0)个整数,将每个整数循环向左移m(≥0)个位置。
函数接口定义:void ArrayShift( int a[], int n, int m );
函数将循环左移后的数组元素仍然存放在a[]中。
#include <stdio.h>
#define MAXN 20
void ArrayShift( int a[], int n, int m );
int main()
{
int a[MAXN], n, m;
int i;
scanf("%d%d", &n, &m);
for ( i = 0; i < n; i++ )
scanf("%d", &a[i]);
ArrayShift(a, n, m);
for ( i = 0; i < n; i++ )
{
if (i != 0) printf(" ");
printf("%d", a[i]);
}
printf("\n");
return 0;
}
输入样例:
6 2
1 2 3 4 5 6
输出样例:
3 4 5 6 1 2
输入样例:
5 6
1 2 3 4 5
输出样例:
2 3 4 5 1
// 将数组中指定范围内的元素逆序
void Reverse(int a[], int start, int end)
{
while (start < end)
{
int temp = a[start]; // 保存起始位置的元素到临时变量
a[start] = a[end]; // 将末尾位置的元素赋值给起始位置
a[end] = temp; // 将临时变量的值赋值给末尾位置
start++; // 向后移动起始位置
end--; // 向前移动末尾位置
}
}
// 实现数组的循环左移
void ArrayShift(int a[], int n, int m)
{
m = m % n; // 处理m大于n的情况
Reverse(a, 0, m - 1); // 将前m个元素逆序
Reverse(a, m, n - 1); // 将后n-m个元素逆序
Reverse(a, 0, n - 1); // 将整个数组逆序
}