题目描述
编写程序,将输入的一行字符串加密。加密时,每个字符的ASCII码依次反复加上密码表4、9、6、2、5、7、3中对应的数字,如果相加结果超过字符z的ASCII码122,则进行取模运算。解密与加密的顺序相反。要求编写加密和解密两个函数,输入各个过程的结果。
例如:输入“The result of 3 and 2 is not 8”,应该r加5,u+4,等等。
示例
思路
-
定义一个string类型的字符串,用getline接收一行数据,这样就可以接收到空格了。
-
encrypt加密:按照要求,每个字符+对应的密码,若超过则对122取模,最后输入加密后字符。
-
decrypt解密:每个字符减去对应的密码,但要提前判断一下,该字符是否大于密码,若小于的话,肯定是之前取模了,所以要加上122,再去减对应的密码才可。
具体实现
#include<bits/stdc++.h>
using namespace std;
int f[7] = {4,9,6,2,5,7,3}; //密码表
string encrypt(string s){ //加密
int ls = s.size();
for(int i=0; i<ls; i++){
s[i] = s[i]+f[i%7]; //数字和字符可以直接加减,不用再转换成数字了
if(s[i]>122){
s[i]=s[i]%122;
}
}
return s;
}
string decrypt(string s){ //解密
int ls = s.size();
for(int i=0; i<ls; i++){
if(s[i]<f[i%7]){
s[i] = s[i]+122-f[i%7];
}else{
s[i] = s[i]-f[i%7];
}
}
return s;
}
int main(){
string s;
getline(cin,s); //用getline的话,string可以接收到空格
//加密
string s1 = encrypt(s);
cout<<s1<<endl;
//解密
string s2 = decrypt(s1);
cout<<s2<<endl;
return 0;
}
总结
-
多读几遍题,想一想思路,写下来,用代码实现。
-
单个字符和数字可以直接相加,不用转换成数字再加了。如果是进制转换需要加减乘除的话,要把字符转数字,其余情况可以直接字符加数字。