杂耍算法步骤:
1)先将x[0]移到临时变量t中
2)将x[i]移动到x[0]中,x[2i]移动到x[i]中,依次类推
3)将x中的所有下标都对n取模,直到我们又回到从x[0]中提取元素。不过这时我们从t中提取元素,结束。
问题描述:
请将一个具有n个元素的一维向量x向左旋转i个位置。例如,假设n=8, i=3,那么向量abcdefgh旋转之后得到向量defghabc。
#include<stdio.h>
//使用辗转相除法求最大公约数
int gcd(int a, int b)
{
if (a % b == 0)
{
return b;
}
else
{
return gcd(b, a%b);
}
}
//杂耍算法
void rotate(char* a,int n,int i)
{
int step = gcd(n,i);
for(int j = 0; j < step; j++)
{
int temp = a[j];
int current = j;
while(1)
{
int next= (current + i) % n;
if(next== j)
{
break;
}
a[current] = a[next];
current= next;
}
a[current] = temp;
}
}
in