题解 | 字符串加解密

字符串加解密

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优化后的,感觉挺精简的

全部评论

相关推荐

xtu大迫杰:偶遇校友,祝校友offer打牌
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务