第一行输入一个长度为
,仅由小写字母构成的字符串
,代表待构建的新字母表底串。
第二行输入一个长度为
,仅由小写字母构成的字符串
,代表需要加密的明文。
在一行上输出一个字符串,代表加密后的密文。
trailblazers attackatdawn
tpptadtpitvh
在这个样例中,加密的操作如下:
对
进行去重
,得到
;
随后从
开始依次在字符串末尾补充
中未出现的字母,得到
;
最后,对于
中的每个字母,替换为
构建得到的新字母表中相同位置的字母。我们可以列出对照表:
最后,对于
中的每个字母,替换为
构建得到的新字母表中相同位置的字母,得到
。
nihao ni
le
#include <stdio.h> #include <string.h> int main() { char key[105]; int flag[26] = {0}; char change[26]; int t = 0; scanf("%s", key); // 利用key出现的字母构造change数组的前半部分 for (int i = 0; i < strlen(key); i++) { int temp = key[i] - 'a'; if (flag[temp] == 1) continue; else { flag[temp] = 1; change[t] = key[i]; t++; } } // 利用记录出现字母的flag数组构造change数组的后半部分 for (int i = 0; i < 26; i++) { if (flag[i] == 0) { change[t] = (char)(i + 'a'); t++; } } // 利用构造好的对应单词表change数组,输出加密后的字符串 char str[105]; scanf("%s", str); for (int i = 0; i < strlen(str); i++) { char temp = str[i]; int c = temp - 'a'; printf("%c", change[c]); } return 0; }
#include <string.h> #include <stdio.h> #include <stdlib.h> void GetTrueKey(char trueKey[], char key[], int len, char otherKey[]) { int bit = -1; int hash[256] = {0}; for(int i = 0; i < len; i++){ if(hash[key[i]] == 0){ hash[key[i]] = 1; trueKey[++bit] = key[i]; } } trueKey[++bit] = 0; int cnt = -1; for(int i = 'a'; i <= 'z'; i++){ if(hash[i] == 0){ otherKey[++cnt] = i; } } otherKey[++cnt] = 0; } int main() { char key[100] = {0}; char s[101] = {0}; scanf("%s", key); scanf("%s", s); char trueKey[27] = {0}; char otherKey[27] = {0}; GetTrueKey(trueKey, key, strlen(key), otherKey); strcat(trueKey, otherKey); for(int i = 0; i < strlen(s); i++){ printf("%c", trueKey[s[i]-'a']); } return 0; }
#include <stdio.h> #include <string.h> int main() { char encode[26] = {}; char key[100] = {}; char key2[100] = {}; char str[100] = {}; scanf("%s", key); scanf("%s", str); int len = strlen(key); //去重key得到新的key2 int count[26] = {0}; int p = 0; for (int i = 0; i < len; i++) { if (count[key[i] - 'a'] == 0) { key2[p] = key[i]; p++; count[key[i] - 'a'] = 1; } } //用key2建立密码表 for (int i = 0; i < p; i++) { encode[i] = key2[i]; } for (int i = 0; i < 26; i++) { if (count[i] == 0) { encode[p] = i + 'a'; count[i] = 1; p++; } } //输出加密字符串 int len2 = strlen(str); for (int i = 0; i < len2; i++) { printf("%c", encode[str[i] - 'a']); } return 0; }
#include <stdio.h> #include <string.h> int main(){ char key[100];char txt[100]; scanf("%s",key);scanf("%s",txt); char translate[26]={0}; for(int i=0;i<strlen(key);i++){//按密钥生成转换表并去重 int j=0;int flag=0; while(translate[j]){ if(translate[j]==key[i]){ flag=1; break; } j++; } if(!flag){ translate[j++]=key[i]; } } int l=strlen(translate); for(int i=0;i<26;i++){//补全26位的转换表 int flag=0; for(int j=0;j<l;j++){ if(translate[j]=='a'+i){ flag=1; break; } } if(!flag){ translate[l++]='a'+i; } } for(int i=0;i<strlen(txt);i++){ txt[i]=translate[txt[i]-'a']; printf("%c",txt[i]); } }
#include <stdio.h> #define N 100 int main() { char key[N],str[N],seek[26]; int i=0,j,len=0,arr[26]={0}; gets(key); gets(str); while(key[i]!='\0') { if(len==0) { seek[len++]=key[i]; arr[key[i]-'a']=1; } else { for(j=0;j<len;j++) { if(seek[j]==key[i]) break; } if(j==len) { seek[len++]=key[i]; arr[key[i]-'a']=1; } } i++; } for(i=len;i<26;i++) { for(j=0;j<26;j++) { if(arr[j]==0) { seek[i]='a'+j; arr[j]=1; break; } } } i=0; while(str[i]!='\0') { printf("%c",seek[str[i]-'a']); i++; } return 0; }
/* 注意:仅包含小写字母 思路:建立顺序字母表dict作为字典 用一个数组标记26个字母,遍历密匙,遇到字母标记为selected并加入字典,重复字母跳过 遍历完密匙,不存在的字母就放到后面 最后获取明文,根据dict置换字母 时空复杂度:O(m+n); O(1) */ #include <stdio.h> #include <string.h> int main(void) { char in[101]; char key[101]; while( scanf("%[^\n]", key) != EOF){ getchar(); scanf("%[^\n]", in); getchar(); char dict[26] = {0}; int selected[26] = {0}; int j = 0; for(int i=0; i < strlen(key); i++){ //遍历密匙 if( !selected[ key[i]-'a' ] ){ //如果是未被选中过的字母 selected[ key[i]-'a' ] = 1; dict[j] = key[i]; //选中并添加到字典dict j++; } } for(int i=0; i<26; i++){ //密匙中没有的字母,按字母表顺序放到dict后面 if( !selected[i] ){ dict[j] = 'a' + i; j++; } } for(int i=0; i<strlen(in); i++){ if( ' ' != in[i] ){ in[i] = dict[ in[i]-'a' ]; //根据dict替换小写字母 } } printf("%s\n", in); } return 0; }
#include<stdio.h> #include<stdlib.h> #include<string.h> int main() { char str[101]={0}; while(gets(str)) { char alpha[26]={0}; /*lower alphabet*/ char encrypt[26]={0}; /*lower alphabet*/ int count[200]={0}; /*lower alphabet*/ char source[101]={0}; gets(source); int len = strlen(str); int sourlen=strlen(source); int i,j,k; for(i=0;i<26;i++) { alpha[i]='a'+i; } j=0; for(i=0;i<len;i++) { if(count[str[i]]==0) { encrypt[j]=str[i]; count[str[i]]++; j++; } } while(j<26) { for(i=0;i<26;i++) { if(count[alpha[i]]==0) { encrypt[j]=alpha[i]; j++; } } } for(i=0;i<sourlen;i++) { for(k=0;k<26;k++) { if(alpha[k]==source[i]) { source[i]=encrypt[k]; break; } } } printf("%s\n",source); } return 0; }
按照题目要求: 1.先对密钥进行处理 2.将下方的数组补全 3.根据需要加密的字符串找出下放数组对应的字符输出即可 代码中做了一个转化成大写的封装 #include<stdio.h> #include<string.h> char shang[26] = {'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'}; char xia[27] = {0}; // 转化大写 char toUper(char in) { if (in >= 'a' && in <= 'z') { in-=32; } return in; } // 查找需要加密的字符 char findChar(char in) { for (int i = 0; i < strlen(shang); i++) { if( shang[i] == in || shang[i] == (in - 32)) { if (in >= 'a' && in <= 'z') { return xia[i] + 32; // 返回小写 } else { return xia[i]; // 返回大写 } } } return 0; } int main(){ char key[100] = {0}; char in[100] = {0}; while (gets(key) && gets(in)) { // 处理密钥,转化为大写,去掉重复字母,存放到xia数组中 for (int i = 0; i < strlen(key); i++) { key[i] = toUper(key[i]); int j = 0; for (j = 0; j < strlen(xia); j++) { if(xia[j] == key[i]) { break; } } if(j == strlen(xia)) { xia[j] = key[i]; } } // 补全下方的xia数组 for (char p = 'A'; p <= 'Z'; p++){ int j = 0; for (j = 0; j < strlen(xia); j++) { if (xia[j] == p) { break; } } if (j == strlen(xia)) { xia[j] = p; } } for (int i = 0; i < strlen(in); i++){ printf("%c", findChar(in[i])); } printf("\n"); memset(xia, 0, sizeof(xia)); // 重置全局数组,否则第二组数据报错 } }
#include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct list { int val; struct list *next; }List; int main() { char key[100]; int i,j; while(gets(key)) { int len=strlen(key); char base[26]; int count=0; int flag=1; for(i=0;i<len;i++) { if(key[i]<='Z'&&key[i]>='A') { key[i]=key[i]-'A'+'a'; } flag=1; for(j=0;j<count;j++) { if(base[j]==key[i]) { flag=0; break; } } if(flag==1) { base[count++]=key[i]; } } for(i=0;i<26;i++) { flag=1; for(j=0;j<count;j++) { if(base[j]==(i+'a')) { flag=0; break; } } if(flag==1) { base[count++]=(i+'a'); } } char input[100]; gets(input); len=strlen(input); for(i=0;i<len;i++) { if(input[i]<='Z'&&input[i]>='A') { input[i]=input[i]-'A'+'a'; input[i]=base[input[i]-'a']-'a'+'A'; } else { input[i]=base[input[i]-'a']; } } printf("%s\n",input); } return 0; }