题解 | 字符串加解密
字符串加解密
https://www.nowcoder.com/practice/2aa32b378a024755a3f251e75cbf233a
#include <stdio.h>
#include <ctype.h>
#include <string.h>
void jiamijiemi(char* str, int flag) {
for (int i = 0; str[i] != '\0'; i++) {
if (flag == 0) {
// 加密
if (islower(str[i])) {
// z -> a, 其余 +1, 最后变大写
char next = (str[i] == 'z') ? 'a' : str[i] + 1;
str[i] = toupper(next);
} else if (isupper(str[i])) {
// Z -> A, 其余 +1, 最后变小写
char next = (str[i] == 'Z') ? 'A' : str[i] + 1;
str[i] = tolower(next);
} else if (isdigit(str[i])) {
// 9 -> 0, 其余 +1
str[i] = (str[i] - '0' + 1) % 10 + '0';
}
} else {
// 解密 (flag == 1)
if (islower(str[i])) {
// a -> z, 其余 -1, 最后变大写
char prev = (str[i] == 'a') ? 'z' : str[i] - 1;
str[i] = toupper(prev);
} else if (isupper(str[i])) {
// A -> Z, 其余 -1, 最后变小写
char prev = (str[i] == 'A') ? 'Z' : str[i] - 1;
str[i] = tolower(prev);
} else if (isdigit(str[i])) {
// 0 -> 9, 其余 -1
str[i] = (str[i] - '0' + 9) % 10 + '0'; // +9 %10 等同于 -1
}
}
}
}
int main() {
char s[1010], t[1010];
if (fgets(s, sizeof(s), stdin))
s[strcspn(s, "\n")] = '\0';
if (fgets(t, sizeof(t), stdin))
t[strcspn(t, "\n")] = '\0';
jiamijiemi(s, 0);
jiamijiemi(t, 1);
printf("%s\n%s\n", s, t);
return 0;
}
我自己写的没有这么规范,但是也能运行通过(除了数字),这是ai优化后的,感觉挺精简的


查看5道真题和解析