华为机试HJ29 字符串加解密
首先看一下题
描述
对输入的字符串进行加解密,并输出。
加密方法为:
当内容是英文字母时则用该英文字母的后一个字母替换,同时字母变换大小写,如字母a时则替换为B;字母Z时则替换为a;
当内容是数字时则把该数字加1,如0替换1,1替换2,9替换0;
其他字符不做变化。
解密方法为加密的逆过程。
数据范围:输入的两个字符串长度满足 1≤n≤1000 ,保证输入的字符串都是只由大小写字母或者数字组成
输入描述:
第一行输入一串要加密的密码
第二行输入一串加过密的密码输出描述:
第一行输出加密后的字符
第二行输出解密后的字符示例1
输入:
abcdefg BCDEFGH输出:
BCDEFGH abcdefg
一、问题分析
1.对输入的字符串进行加解密,并输出。
2.加密方法为:
当内容是英文字母时则用该英文字母的后一个字母替换
3.同时字母变换大小写,如字母a时则替换为B
字母Z时则替换为a
4.当内容是数字时则把该数字加1,如0替换1,1替换2,9替换0;
5.其他字符不做变化。
6.解密方法为加密的逆过程。
7.数据范围:输入的两个字符串长度满足n大于等于1,小于等于1000,
8.保证输入的字符串都是只由大小写字母或者数字组成
9.输入描述:第一行输入一串要加密的密码
第二行输入一串加过密的密码
10.输出描述:第一行输出加密后的字符
第二行输出解密后的字符
二、解题思路
1.首先我们定义两个字符串用来接收数据char toEncode[1001];
char strtoDecode[1001];
2.然后我们读取数据scanf("%s", toEncode);
scanf("%s", toDecode);
3.我们定义两个正整数用来存储两个字符串的长度
int lenE = strlen(toEncode);
int lenD = strlen(toDecode);
4.我们写两个方法,一个是char *encode(char *e, len);
一个是一个是char *decode(char *d, len);
5.我们定义两个新的字符串char encoded[lenE];char decoded[lenD];用来存储我们整理后的字符串
6.在encode方法中,我们需要对字符串进行加密,
所以for(int i = 0; i < len; i++)我们用for循环遍历字符串e,
如果遇到了字母'z'我们变成‘A’,如果遇到字母‘Z’我们变成‘a’,如果遇到‘9’我们变成0
然后我们判断如果是大写字母isupper,我们先tolower然后+1
如果是小写字母islower我们先toupper然后+1
如果是数字我们+1
然后返回encode之后的字符串
7.在decode方法中,我们需要对字符串进行解密,解密方法是加密方法的逆过程
还是一个for循环
for(int i = 0; i < len; i++)
如果遇到了字母'A',我们变成字母'z',如果遇到了字母‘a’,我们变成字母'Z',如果遇到‘0’我们变成‘9’
然后我们判断,如果是大写字母isupper我们先tolower然后-1
如果是小写字母islower我们先toupper然后-1
如果是数字我们-1
然后返回decode之后的字符串
三、具体步骤
使用的语言是C
#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include <stdlib.h>
char *encode(char *e, int len);
char *decode(char *d, int len);
int main() {
char toEncode[1001];
char toDecode[1001];
scanf("%s", toEncode);
scanf("%s", toDecode);
int lenE = strlen(toEncode);
int lenD = strlen(toDecode);
char *encoded = (char *)malloc((lenE + 1) * sizeof(char));
char *decoded = (char *)malloc((lenD + 1) * sizeof(char));
strcpy(encoded, encode(toEncode, lenE));
strcpy(decoded, decode(toDecode, lenD));
printf("%s\n", encoded);
printf("%s\n", decoded);
}
char *encode(char *e, int len) {
for(int i = 0; i < len; i++) {
if(e[i] == 'Z') e[i] = 'a';
else if(e[i] == 'z') e[i] = 'A';
else if(e[i] == '9') e[i] = '0';
else if(isupper(e[i])) e[i] = tolower(e[i]) + 1;
else if(islower(e[i])) e[i] = toupper(e[i]) + 1;
else e[i]++;
}
return e;
}
char *decode(char *d, int len) {
for(int i = 0; i < len; i++) {
if(d[i] == 'a') d[i] = 'Z';
else if (d[i] == 'A') d[i] = 'z';
else if (d[i] == '0') d[i] = '9';
else if (isupper(d[i])) d[i] = tolower(d[i]) - 1;
else if (islower(d[i])) d[i] = toupper(d[i]) - 1;
else d[i]--;
}
return d;
}