加密与解密

30 阅读2分钟

题目描述

编写程序,将输入的一行字符串加密。加密时,每个字符的ASCII码依次反复加上密码表4、9、6、2、5、7、3中对应的数字,如果相加结果超过字符z的ASCII码122,则进行取模运算。解密与加密的顺序相反。要求编写加密和解密两个函数,输入各个过程的结果。

例如:输入“The result of 3 and 2 is not 8”,应该r加5,u+4,等等。

示例

image.png

思路

  1. 定义一个string类型的字符串,用getline接收一行数据,这样就可以接收到空格了。

  2. encrypt加密:按照要求,每个字符+对应的密码,若超过则对122取模,最后输入加密后字符。

  3. 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;
}

总结

  • 多读几遍题,想一想思路,写下来,用代码实现。

  • 单个字符和数字可以直接相加,不用转换成数字再加了。如果是进制转换需要加减乘除的话,要把字符转数字,其余情况可以直接字符加数字。