【C语言】反序加密(非文件)

算法集训传送门》

  引言

在这里插入图片描述

铭记于心
我唯一知道的,便是我一无所知

❄️我们的算法之路❄️

   众所周知,作为一名合格的程序员,算法 能力 是不可获缺的,并且在算法学习的过程中我们总是能感受到算法的✨魅力✨。
              ☀️短短几行代码,凝聚无数前人智慧;一个普通循环,即是解题之眼☀️
   二分贪心并查集二叉树图论深度优先搜索(dfs)宽度优先搜索(bfs)数论动态规划等等, 路漫漫其修远兮,吾将上下而求索! 希望在此集训中与大家共同进步,有所收获!!!

在这里插入图片描述


一、【问题描述】

有一种加密方法为:其使用一个字母串(可以含重复字母,字母个数不超过50)作为密钥。假定密钥单词串为feather,则先去掉密钥单词中的重复字母得到单词串feathr,然后将其反序,并将字母表中的其它字母以反序追加到后面:

r h t a e f z y x w v u s q p o n m l k j i g d c b
加密字母的对应关系如下:

a b c d e f g h i j k l m n o p q r s t u v w x y z
r h t a e f z y x w v u s q p o n m l k j i g d c b
其中第一行为原始英文字母,第二行为对应加密字母。其它字符不进行加密。编写一个程序,用这种密码加密输入的字符串。假定输入的待加密字符串中的字母全为小写字母,并且输入密钥也全为小写字母。

【输入形式】

从标准输入中输入密钥串,然后在下一行输入要加密的字符串。密钥串字母个数不超过50个,待加密字符串的字符数不超过100个。

【输出形式】

加密后结果输出到标准输出。

【样例输入】

feather
c language is wonderful.

【样例输出】

t urqzjrze xl gpqaemfju.

【样例说明】

首先将给定的密钥单词去除重复字母并反序,然后按照上面的加密对应表对后面的内容进行加密即可得到加密后的字符串,其中只对英文字母进行加密对换,并且假设英文字母全是小写字母。

二、思路详解

大致思路如下:

  1. 首先按照题目中的规律处理输入的字符串,得到加密秘钥(具体就是字符串去重,然后反转,再把剩下字母表中得字母加进来)
  2. 接下来就是根据输入得到输出(与字母表对应,直接用类似于哈希表进行)

三、代码呈现

#include

int main() {
	char str[100], pwd[28];
	int flag[266] = { 0 };
	scanf("%s", str);
	flag[str[0]] = 1;
	int index = 1, index2 = 0;
	for (int i = 1; i < strlen(str); i++) {
		int f = 0;
		for (int j = i - 1; j >= 0; j--) {
			if (str[j] == str[i])f = 1;
		}
		if (!f) {
			str[index++] = str[i];
			flag[str[i]] = 1;
		}
	}
	str[index] = '\0';
	for (int i = index - 1; i >= 0; i--) {
		pwd[index2++] = str[i];
	}
	for (int i = 25; i >= 0; i--) {
		if (!flag['a' + i])pwd[index2++] = 'a' + i;
	}
	pwd[index2++] = '\0';
	char reqAns[1024];
	getchar();
	gets(reqAns);
	for (int i = 0; i < strlen(reqAns); i++) {
		if (isalpha(reqAns[i]))
			printf("%c", pwd[reqAns[i] - 'a']);
		else
			printf("%c", reqAns[i]);
	}

	return 0;
}

写在最后
相信大家对今天的集训内容的理解与以往已经有很大不同了吧,或许也感受到了算法的魅力,当然这是一定的,路漫漫其修远兮,吾将上下而求索!伙伴们,明天见!在这里插入图片描述

你可能感兴趣的:(C/C++那些事,算法集训,c语言,开发语言)