#include <iostream>
using namespace std;
//将前i个元素复制到临时数组中
template<class T>
void func0(T a[],int len,int i){
char *temp=new T[i];
int j;
for(j=0;j<i;j++){
temp[j]=a[j];
}
for(j=0;j<len;j++)
if(j<len-i) a[j]=a[j+i];
else a[j]=temp[(j+i)-len];
delete temp;
}
template<class T>
void my_swap(T& a,T& b){
T temp;
temp=a;
a=b;
b=temp;
}
template<class T>
void my_reverse(T a[],int f,int l){
int i=f,j=l;
while(i<j){
my_swap(a[i++],a[j--]);
}
}
//基于交换
template<class T>
void func2(T a[],int len,int i){
my_reverse(a,0,i-1);
my_reverse(a,i,len-1);
my_reverse(a,0,len-1);
}
//移动i位
template<class T>
void func1(T a[],int len,int i){
int g=1;//最大公约数
for(int j=1;j<len && i;j++)
if(len % j ==0 && i % j == 0 )
g=j;
for(int j=0;j<g;j++){
T temp=a[j];
int l,r;
l=j;
while(true){
r=l+i;
if (r >= len)
r=r-len;
if (r == j)
break;
a[l]=a[r];
l=r;
}
a[l]=temp;
}
}
int main(){
char a[]="abcde233446878fgh";
func0(a,17,7);
cout<<a<<endl;
char b[]="abcde233446878fgh";
func1(b,17,7);
cout<<b<<endl;
char c[]="abcde233446878fgh";
func2(c,17,7);
cout<<c<<endl;
system("pause");
return 0;
}