问题描述
对于顺序表 L=(a_0, a_1, ..., a_{n-1}),循环左移 k 位意味着将顺序表变为 L^k=(a_k, a_{k+1}, ..., a_{n-1}, a_0, a_1, ..., a_{k-1})。
比如:长度为 8 的顺序表 (1, 2, 3, 4, 5, 6, 7, 8),循环左移 3 位后的结果为 (4, 5, 6, 7, 8, 1, 2, 3)。
输入格式
第一行输入两个整数 n(1 <= n <= 100) 和 k(0 ≤ k ≤ n),分别表示顺序表的元素个数和循环左移的位移量。
第二行一共 n 个整数 ai(0 ≤ ai ≤ 10000),表示顺序表中元素的值。
输出格式
输出只有一行,输出 n 个整数,顺序输出循环左移后顺序表中每个元素的值,每个元素之间用一个空格分隔。行末不要有多余空格。
样例输入
8 3
1 2 3 4 5 6 7 8
样例输出
4 5 6 7 8 1 2 3
源代码
#include<iostream>
using namespace std;
#define MaxSize 100
//定义一个长度为100的顺序表
typedef struct{
int data[MaxSize]; //顺序表的元素
int length; //顺序表的当前长度
}SqList;
bool ListInsert(SqList &L,int i,int e) //将值为e的元素插入到L的第i个位置
{
if(i<1||i>L.length+1) //判断i的范围是否有效
return false;
if(L.length>=MaxSize) //当前存储空间已满,不能插入
return false;
for(int j=L.length;j>=i;j--) //将第i个元素及之后的元素后移
L.data[j]=L.data[j-1];
L.data[i-1]=e; //在位置i处放入e
L.length++; //线性表长度加1
return true;
}
bool ListLoop(SqList &L,int move) //将L循环左移move个单位
{
//被注释的部分是我开始的一种写法,其中第一个for循环是先让L.length增加move个长度后,
//将顺序表L的前move个元素依次插入到表尾,因此顺序表变为1 2 3 4 5 6 7 8 1 2 3;
//第二个for循环是将整个顺序表往前移动move位,顺序表变为4 5 6 7 8 1 2 3,再将L.length
//减少move个长度。这种写法对于题中样例没有问题,可是一旦输入数字变多,输出就不正常,
//想了半天不知道问题出在哪里,所以换一种写法。
/*L.length+=move;
for(int j=1;j<=move;j++)
{
ListInsert(L,L.length-move+1,L.data[j-1]);
}
for(int j=1;j<(L.length-move);j++)
{
L.data[j-1]=L.data[j-1+move];
}
L.length-=move;*/
//新的写法:第一个for循环,将L复制到新顺序表M中;第二个for循环,将M中的元素对应地赋值给L
SqList M;
M.length=L.length;
for(int i=1;i<=L.length;i++)
M.data[i-1]=L.data[i-1];
for(int i=0;i<=L.length-1;i++)
{
L.data[i]=(M.data[(i+move+L.length)%L.length]);
}
}
int main()
{
SqList L;
L.length=0;
int num,move,shuru;
cin>>num>>move;
for(int i=1;i<=num;i++)
{
cin>>shuru;
ListInsert(L,i,shuru);
}
ListLoop(L,move);
for(int i=0;i<num-1;i++)
cout<<L.data[i]<<" ";
cout<<L.data[num-1]; //如果这里不这么写,输出最后一个数字后面还有一个空格,
//计蒜客系统就判定我格式错误,所以稍微改了一下
}