#include<iostream>
#include<string>
using namespace std;
//method1
/*
简单的办法,可以每次将数组中的元素右移一位,循环k次。
不妨设k是一个非负的整数,当k为负整数的时候,右移k位,相当于
左移(-k)位。左移和右移本质上是一样的。大家开始可能会有这样潜在的假设,k<N。事实上,很多时候也的确是这样的。
但严格来说,我们不能用这样的“惯性思维”来思考问题。尤其在编程的时候,要全面的考虑问题。
右移k位之后的情形,跟右移k'=k%N位之后的情形一样。考虑到循环右移的特点之后,算法复杂度降为O(N^2),这跟k无关。
*/
string CycleMove(string arr,int len,int k)
{
k=k%len;
for(int i=0;i<k;i++)
{
char temp=arr[len-1];
for(int j=len-1;j>0;j--)
{
arr[j]=arr[j-1];
}
arr[0]=temp;
}
return arr;
}
//method2
/*
abcd1234右移4位的变换过程可以通过以下步骤完成:
逆序排列abcd:abcd1234 -> dcba1234
逆序排列1234:dcba1234 -> dcba4321
全部逆序: dcba4321 -> 1234abcd
时间复杂度为O(N)
*/
void reverse(char* arr,int b,int e) //将arr[b,...,e]反转
{
for(;b<e;b++,e--)
{
char ch=arr[b];
arr[b]=arr[e];
arr[e]=ch;
}
}
void CycleMove2(char* arr,int len,int k)
{
k=k%len;
reverse(arr,0,len-k-1);
reverse(arr,len-k,len-1);
reverse(arr,0,len-1);
}
int main()
{
string arr;
char* str;
int k,i;
while(cin>>arr)
{
cin>>k;
int len=arr.length();
str=new char[len+1];
for(i=0;i<len;i++)
{
str[i]=arr[i];
}
str[i]='\0';
string result=CycleMove(arr,len,k);//调用方法一
cout<<result<<endl;
CycleMove2(str,len,k);//调用方法二
for(i=0;i<len;i++)cout<<str[i];
cout<<endl;
delete [] str;
}
system("pause");
return 0;
}