题目描述
本题要求实现一个对数组进行循环右移的简单函数:一个数组a中存有n个整数,将每个整数循环向右移m(n≥m)个位置,即将a中的数据由(a0a1⋯an−1)变换为(an−m⋯an−1a0a1⋯an−m−1)(最后m个数循环移至最前面的m个位置)。
要求函数内访问数组元素使用指针,不要使用数组下标。
主函数参考如下:
#include <iostream>
using namespace std;
void ArrayShift( int a[], int n, int m );
int main()
{
const int MAXN = 10;
int a[MAXN], n, m;
int i;
cin>>n>>m;
for ( i = 0; i < n; i++ )
cin>>a[i];
ArrayShift(a, n, m);
for ( i = 0; i < n; i++ ) {
if (i != 0) cout<<" ";
cout<<a[i];
}
cout<<endl;
return 0;
}
/* 你的代码将被嵌在这里 */
输入
函数接口定义:
void ArrayShift( int a[], int n, int m );
其中a[]
是用户传入的数组;n
是数组的大小;m
是右移的位数。函数ArrayShift
须将循环右移后的数组仍然存在a[]
中。
输出
见样例
样例查看模式
正常显示查看格式
输入样例1 <-复制
6 2
1 2 3 4 5 6
输出样例1
5 6 1 2 3 4
#include <iostream>
using namespace std;
void ArrayShift(int a[], int n, int m);
int main()
{
const int MAXN = 10;
int a[MAXN], n, m;
int i;
cin >> n >> m;
for (i = 0; i < n; i++)
cin >> a[i];
ArrayShift(a, n, m);
for (i = 0; i < n; i++) {
if (i != 0) cout << " ";
cout << a[i];
}
cout << endl;
return 0;
}
void ArrayShift(int a[], int n, int m)
{
for (int i = 0; i < m; i++)//向右移m次
{
int* p = a + n - 1;
int temp = *p;//每次都把最后一个数字保存
while (p > a)
{
*p = *(p - 1);//从后面往前面推进,依次移动
p--;
}
*p = temp;//最后一个数字放到第一个位置上
}
}