序言:
这是我第一次写博客,有不足之处,希望大家指出,谢谢!
这次的题目一共有三个难度,分别是简单,中等偏下,中等。对于一些刚刚入门的小伙伴来说,比较友好。废话不多说,直接进入正题。
正文:
简单难度:
【题目要求】:
实现以《三国演义》为密码本,对输入的中文文本进行加密和解密。至于加密方式,最简单的从0开始,一直往后,有多个字,就最多到多少。
【分析】:
1.知识背景:需要用到文件的读写操作,以及字典和集合的相关知识。
2思路:现将文件读取进来,然后对文字进行依次编码,存入字典中.
【代码】:
#------------------------------简单难度----------------------------------- def Load_file_easy(path): #[注]返回值是一个set,不可进行数字索引 file = open(path,'r',encoding='utf8') Str = file.read() Str = set(Str) file.close() return Str def Encode_easy(Lstr): Sstr = list(set(Lstr)) Encode_Dict = {} for i in range(len(Lstr)): Encode_Dict[Sstr[i]] = i return Encode_Dict def Decode_easy(Encode_dict): List1 = Encode_dict.keys() List2 = Encode_dict.values() Decode_Dict = dict(list(zip(List2,List1))) return Decode_Dict path = 'SanGuo.txt' Str = list(Load_file_easy(path)) Encode_dict = Encode_easy(Str) Decode_dict = Decode_easy(Encode_dict) #写入同级目录下的文件中,如果不存在文件,则会新创建 #(博主的运行环境是:Ubuntu,win系统的小伙伴可能会在文件末尾加上.txt 啥的,略略略) with open('easy_degree_Encode_dict','w') as file: file.write(str(Encode_dict)) with open('easy_degree_Decode_dict','w') as file: file.write(str(Decode_dict))
中等偏下难度:
【题目要求】:
对《三国演义》的电子文档进行页的划分,以400个字为1页,每页20行20列,那么建立每个字对应的八位密码表示,其中前1~4位为页码,5、6位为行号,7、8位为这一行的第几列。例如:实:24131209,表示字“实”出现在第2413页的12行的09列。 利用此方法对中文文本进行加密和解密。
【分析】
和简单难度相比,就是加密的方式产生了不同,所以简单难度的框架可以保留。
加密方式:首先要知道这个电子文档有多少页,可以len(Str)//400,就得到了多少页(我觉得多一页少一页没啥影响就没有+1了),然后就是要对每一个字能正确的得到它的行号和列号,具体方法见代码。
【代码】:
def Load_file_middle(path): with open(path,'r',encoding='utf8') as file: Str = file.read() return Str def Encode(Str): Encode_dict = {} #得到页数 for i in range(len(Str)//400): page = i + 1 temp = Str[(i*400):(400*(i+1))] page_str = str(page) page_str = page_str.zfill(4) #得到行号row和列号col for j in range(400): col = str(j) col = col.zfill(2) #这里稍微说一下:比如02是第三列,12是第13列,112是第13列,看看规律就可以了 if int(col[-2])%2 ==0: col = int(col[-1]) + 1 else: col = int(col[-1]) + 11 row = str(j//20 +1) row = row.zfill(2) col = (str(col)).zfill(2) #print(page_str,row,col) Encode_dict[temp[j]] = page_str+row+str(col) return Encode_dict