rotate<不含3次翻转>
#include<iostream>
/*
案例一 长度7旋转2 gcd = 1 故 i < 1
i = 0 i = (i+dis)%len
_bcdefg (0+2)%7 = 2
cb_defg (2+2)%7 = 4
cbed_fg (4+2)%7 = 6
cbedgf_ (6+2)%7 = 1
c_edgfb (1+2)%7 = 3
cde_gfb (3+2)%7 = 5
cdefg_b (5+2)%7 = 0 循环结束 0 = 0
cdefgab 初始空缺位补上
案例二 长度6旋转3 gcd = 3 故 i < 3
i = 0
abcdef
_bcdef (0+3)%6 = 3
dbc_ef (3+3)%6 = 0 循环结束
dbcaef 补上循环初始位
i = 1
d_caef (1+3)%6 = 4
deca_f (4+3)%6 = 1 循环结束
decabf 补上循环初始位
i = 2
de_abf (2+3)%6 = 5
defab_ (5+3)%6 = 2 循环结束
defabc 补上循环初始位
*/
int gcd(int m, int n){//求最大公约数
int t;
while ((t = m%n) != 0){
m = n;
n = t;
}
return n;
}
void myrotate_cycle(char *str, char* first,int dis,int len)
{
char cfirst = *first;
char *temp = first;
char *ptr = first + (first - str + dis) % len;
while (ptr != first){
*temp = *ptr;
temp = ptr;
int n = ptr - str;
ptr = first + (ptr - str + dis) % len;
}
*temp = cfirst;
}
void myrotate(char *str, char* middle)
{
int len = strlen(str);
int dis = middle - str;
int per = gcd(dis, len);
int i = 0;
while (i < per){//循环次数 [0,gcd)
myrotate_cycle(str, str + i, dis, len);//从 str+i位置开始,开始一个循环,总计n次赋值变换可以实现左旋转
i++;
}
}
int main(int argc, char **argv)
{
char str[10] = "xxhello";
myrotate(str, str+3);
std::cout << str << std::endl;
system("pause");
}