题解 | #字符串加解密#

字符串加解密

https://www.nowcoder.com/practice/2aa32b378a024755a3f251e75cbf233a

// 字符串加解密
#include <stdio.h>
#include <stdlib.h>


char EncryChar(char chr) {
    if (chr >= 'A' && chr <= 'Z') {
        if (chr == 'Z') return 'a';
        else return chr + 32 + 1;
    }
    if (chr >= 'a' && chr <= 'z') {
        if (chr == 'z') return 'A';
        else return chr - 32 + 1;
    }
    if (chr <= '9' && chr >= '0') {
        if (chr == '9') return '0';
        else return chr + 1;
    }
    return 0;
}



/*
解密方法为加密的逆过程。
//好吧,感觉可以建表,因为给定了只出现大小写字母和数字
//思路如下:建立一个map[26大写+26小写+10]
mapfunc要实现输入字符和加密/解密命令参数,返回对应的值
例如,我要加密a,mapfun('a',1),直接找到map[26].enval
如果要解密a,mapfun('a',1),直接找到map[26].deval
//这需要有一张表,先对应A-Za-Z0-9与index的关系
//还得要有个函数,能快速返回index

*/
int Index(char cur) {
    if (cur >= 'A' && cur <= 'Z') return (int)cur - 65;
    if (cur >= 'a' && cur <= 'z') return (int)cur - 97 + 26;
    if (cur >= '0' && cur <= '9') return (int)cur - (int)'0' + 26 + 26;
    return -1;
}
//输入index,返回对应的原字符,方便建表的时候数组引用
char Indexforchar(int index) {
    if (index >= 0) {
        if (index < 26) return index + 65;
        if (index < 26 + 26) return index + 97 -
                                        26; //错误点1:没有考虑传进来的index初始值要-26
        if (index < 26 + 26 + 10) return index + 48 - 26 - 26;
    }
    return 0;
}

typedef struct {
    /* data */
    char enval;
    char deval;
} mapPoint;
//map结构体生成函数
mapPoint* InitMapPoint(int index) {
    char chr = Indexforchar(index);
    mapPoint* newPoint = (mapPoint*)malloc(sizeof(mapPoint));
    newPoint->enval = EncryChar(chr);
    newPoint->deval = 0;
    return newPoint;
}
//补全map的deval
void CompleteMap(mapPoint** mapPoint, int size) {
    for (int i = 0; i < size; i++) {
        int newindex = Index(mapPoint[i]->enval);
        mapPoint[newindex]->deval = Indexforchar(i);
    }
}

char mapfunc(char cur, int enOrde, mapPoint** mp) {
    if (enOrde == 1)
        return mp[Index(cur)]->enval;
    else if (enOrde == 0)
        return mp[Index(cur)]->deval;
    return 0;
}

int main() {
    int size = 26 + 26 + 10;
    mapPoint** mappoint = (mapPoint**)malloc(size * sizeof(
                              mapPoint*)); //错误点2:malloc(size*sizeof(map))只有62个map结构体(sizeof(map)=2)大小,而不是指针62*8的大小
    for (int i = 0; i < size; i++) {
        mappoint[i] = InitMapPoint(i);
        //if(mapPoint[i]->enval=='a')
        //printf("%c ",mapPoint[i]->enval);
    }

    CompleteMap(mappoint, size);
    // for(int i=0;i<size;i++)
    // {
    //     printf("%c %c %c\n",Indexforchar(i),mapPoint[i]->enval,mapPoint[i]->deval);
    // }
    //至此Map建立完成
    char str[1001];
    int i = 0;
    gets(str);
    while (i < 1001) {
        if (str[i] == '\n' || str[i] == 0) break;
        str[i] = mapfunc(str[i], 1, mappoint);
        printf("%c", str[i]);
        i++;
    }
    printf("\n");
    i = 0;
    gets(str);
    while (i < 1001) {
        if (str[i] == '\n' || str[i] == 0) break;
        str[i] = mapfunc(str[i], 0, mappoint);
        printf("%c", str[i]);
        i++;
    }
    //printf("%d",'0');
    return 0;
}

全部评论

相关推荐

被普调的六边形战士很高大:项目经历貌似和专业或者求职方向没大关系?
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务