W's Cipher
其他人写的分析:
Slyar:题意理解起来比较难,看了10几分钟才明白...大意就是把字符串按字母分成3组,[a-i]一组,[j-r]一组,[s-z]以及其他字符一组,然后给出了3个整数表示每组内的轮换间隔,让你在各组内分别旋转...哎,自己多看看就明白了。
理解了题意这题就没什么难度了,继续练习STL,这次使用了vector,很爽。我的代码注释很详细,算法我就不说了。
# include <iostream>
# include <vector>
# include <string>
using namespace std;
int main()
{
int k1, k2, k3, i, len1, len2, len3, pos;
vector<int> n1, n2, n3;
string str;
char dign[81];
while (1)
{
cin>>k1>>k2>>k3;
if (k1 + k2 + k3 == 0)
break;
cin >> str;
n1.clear();
n2.clear();
n3.clear();
len1 = len2 = len3 = 0;
//清楚干净, 然后用n1, n2, n3来保存符合的部分的,在原字符串中的下标位置!
for (i=0; i<str.length(); ++i)
{
if (str[i] >= 'a' && str[i] <= 'i')
n1.push_back(i);
else if (str[i] >= 'j' && str[i] <= 'r')
n2.push_back(i);
else
n3.push_back(i);
}
for (i=0; i<n1.size(); ++i)
{
pos = (i + k1) % n1.size();
dign[ n1[pos] ] = str[ n1[i] ]; //把str中的 n1[i] 位置的元素赋给,dign字符串中, n1[pos] 的位置
}
for (i=0; i<n2.size(); ++i)
{
pos = (i + k2) % n2.size();
dign[ n2[pos] ] = str[ n2[i] ];
}
for (i=0; i<n3.size(); ++i)
{
pos = (i + k3) % n3.size();
dign[ n3[pos] ] = str[ n3[i] ];
}
dign[str.length()] = '\0';
cout<<dign<<endl;
}
return 0;
}