原理见百度百科:欧几里得算法
int gcd(int a, int b)
{
if(a < b)
swap(a, b);
return b == 0 ? a : gcd(b, a % b);
}
用于编程珠玑第二章的向量旋转问题,重新写这个程序:
#include <iostream>
#include <string>
using namespace std;
void rotate(string &str, int i)
{
int strLen = str.size();
int numOfLoop = gcd(strLen, i);
for(int loop = 0; loop < numOfLoop; ++loop)
{
char tmp = str[loop];
int current = loop;
int next = loop + i;
while(next % strLen != loop)
{
str[current] = str[next];
current = (current + i) % strLen;
next = (next + i) % strLen;
}
str[current] = tmp;
}
}
int main() {
string str = "abcdefgh";
rotate(str, 4);
for(auto c : str)
cout << c;
cout << endl;
return 0;
}
本文介绍了一种利用欧几里得算法求最大公约数的方法,并将其应用于字符串的旋转操作中。通过计算字符串长度与旋转步长的最大公约数来确定循环次数,实现了高效且简洁的字符串旋转算法。
4634

被折叠的 条评论
为什么被折叠?



