7-5 数组循环左移 (15 分)
本题要求实现一个对数组进行循环左移的简单函数:一个数组a中存有n(>0)个整数,在不允许使用另外数组的前提下,将每个整数循环向左移m(≥0)个位置,即将a中的数据由(a
0
a
1
⋯a
n−1
)变换为(a
m
⋯a
n−1
a
0
a
1
⋯a
m−1
)(最前面的m个数循环移至最后面的m个位置)。如果还需要考虑程序移动数据的次数尽量少,要如何设计移动的方法?
输入格式:
输入第1行给出正整数n(≤100)和整数m(≥0);第2行给出n个整数,其间以空格分隔。
输出格式:
在一行中输出循环左移m位以后的整数序列,之间用空格分隔,序列结尾不能有多余空格。
输入样例:
8 3
1 2 3 4 5 6 7 8
输出样例:
4 5 6 7 8 1 2 3
#include<iostream>
using namespace std;
//使用三次翻手的方法实现
void input(int[],int);
void move(int[],int,int);
void reverse(int[],int,int);
void ouput(int[],int);
int main()
{
int a[100];
int n,m;
cin >> n >> m;
if(n<m){ //
int k=m%n;
m=k;
}
input(a,n); //读入n个数到a数组中
move(a,n,m); //对a数组循环左移m位
ouput(a,n); //输出a[0,n-1]
return 0;
}
void input(int a[],int n)
{//读入n个数到a数组中
for(int i=0;i<n;i++)
cin >> a[i];
}
void move(int a[],int n,int m)
{
reverse(a,0,m-1);
reverse(a,m,n-1);
reverse(a,0,n-1);
}
void reverse(int a[],int left,int right)
{//对left 和right交换
int i,j,t;
for(i=left,j=right;i<j;i++,j--){
//交换a[i]与a[j]的值
t=a[i];
a[i]=a[j];
a[j]=t;
}
}
void ouput(int a[],int n)
{
for(int i=0;i<n-1;i++) //输出前n-1个数
cout << a[i] <<" ";
cout <<a[n-1];
}