AcWing 3405. W的密码
原题链接
简单
作者:
偷懒小陈
,
2024-03-06 16:18:07
,
所有人可见
,
阅读 14
用新的字符数组保存解密后的字符串
思路:1.先分组,记录各组字符在字符串中的位置 2.算出字符向右旋转后在新字符数组中的对应位置
C++ 代码
#include <stdio.h>
#include <string>
#include <string.h>
#include <vector>
using namespace std;
int main(){
int k1,k2,k3;
while (true){
scanf("%d%d%d",&k1,&k2,&k3);
if (k1 == 0 && k2 == 0 && k3 == 0){
break;
}
char input[100] = {0}; // 存储加密字符数组
scanf("%s",input);
string str = input; //存储加密字符数组
char strDecrypted[100] = {0}; // 存储解密的字符数组
// 把字符串进行分组
// 记录各组字符在字符串中对应的位置
vector<int> first; // 第一组的位置
vector<int> second; // 第二组的位置
vector<int> third; // 第三组的位置
for (int i = 0; i < str.size(); ++i) {
if (str[i]>='a' && str[i]<='i'){
first.push_back(i);
} else if (str[i]>='j' && str[i]<='r'){
second.push_back(i);
} else if ((str[i]>='s' && str[i]<='z') || str[i] == '_'){
third.push_back(i);
}
}
// 解密:向右转
int pos1 = 0; // posi对应每个分组i中的当前下标
int pos2 = 0;
int pos3 = 0;
for (int i = 0; i < str.size(); ++i) {
if (str[i]>='a' && str[i]<='i'){
int next = (pos1+k1)%first.size(); // next记录向右旋转后对应的组内下标
strDecrypted[first[next]] = str[i];
pos1++;
} else if (str[i]>='j' && str[i]<='r'){
int next = (pos2+k2)%second.size();
strDecrypted[second[next]] = str[i];
pos2++;
} else if ((str[i]>='s' && str[i]<='z') || str[i] == '_'){
int next = (pos3+k3)%third.size();
strDecrypted[third[next]] = str[i];
pos3++;
}
}
printf("%s\n",strDecrypted);
}
return 0;
}