列表

详情


HJ36. 字符串加密

描述

有一种技巧可以对数据进行加密,它使用一个单词作为它的密匙。下面是它的工作原理:首先,选择一个单词作为密匙,如TRAILBLAZERS。如果单词中包含有重复的字母,只保留第1个,将所得结果作为新字母表开头,并将新建立的字母表中未出现的字母按照正常字母表顺序加入新字母表。如下所示:

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

T R A I L B Z E S C D F G H J K M N O P Q U V W X Y (实际需建立小写字母的字母表,此字母表仅为方便演示)

上面其他用字母表中剩余的字母填充完整。在对信息进行加密时,信息中的每个字母被固定于顶上那行,并用下面那行的对应字母一一取代原文的字母(字母字符的大小写状态应该保留)。因此,使用这个密匙, Attack AT DAWN (黎明时攻击)就会被加密为Tpptad TP ITVH。

请实现下述接口,通过指定的密匙和明文得到密文。

数据范围: ,保证输入的字符串中仅包含小写字母

输入描述

先输入key和要加密的字符串

输出描述

返回加密后的字符串

示例1

输入:

nihao
ni

输出:

le

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C 解法, 执行用时: 1ms, 内存消耗: 272KB, 提交时间: 2020-10-29

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <limits.h>



int main()
{
	/* 初始化对照表 */
	char sAlphabet[26] = { 0 };
	char cBegin = 'A';
	for (int i = 0; i < 26; i++)
	{
		sAlphabet[i] = cBegin;
		cBegin++;
	}


	char sInWord[100] = { 0 };
	char sText[100] = { 0 };
	while (scanf("%s%s", sInWord, sText) != EOF)
	{
			char sKeyUp[26] = { 0 };
			char sKeyDown[26] = { 0 };
			char sUpInWorf[100] = { 0 };
			/* 输入单词转大写 */
			for (int i = 0; i < strlen(sInWord); i++)
			{
				if (sInWord[i] >= 'a' && sInWord[i] <= 'z')
				{
					sUpInWorf[i] = sInWord[i] - 32;
				}
			}
			/* 单词去重 */
			char sOutWord[26] = { 0 };
			int iCount = 0;
			for (int j = 0; j < strlen(sUpInWorf); j++)
			{
				if (strchr(sOutWord, sUpInWorf[j]) == NULL)
				{
					sOutWord[iCount] = sUpInWorf[j];
					iCount++;
				}
			}

			/* 生成单词表 */
			sprintf(sKeyUp, "%s", sOutWord);
			for (int i = 0; i < 26; i++)
			{
				if (strchr(sKeyUp, sAlphabet[i]) == NULL)
				{
					sKeyUp[iCount] = sAlphabet[i];
					iCount++;
				}
			}

			/* 对照生成小写密码表 */
			for (int i = 0; i < 26; i++)
			{
				sKeyDown[i] = sKeyUp[i] + 32;
			}

			/* 转换 */
			for (int k = 0; k < strlen(sText); k++)
			{
				if (sText[k] >= 'a' && sText[k] <= 'z')
				{
					printf("%c", sKeyDown[sText[k] - 'a']);
				}
				else if (sText[k] >= 'A' && sText[k] <= 'Z')
				{
					printf("%c", sKeyUp[sText[k] - 'A']);
				}
			}
			printf("\n");
	}

	return 0;
}

C 解法, 执行用时: 1ms, 内存消耗: 356KB, 提交时间: 2021-07-31

#include <stdio.h>

int main(void)
{
    char key[1000], *pKey;
    
    while(scanf("%s", &key[0]) != EOF)
    {
        char alpbat[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
        char decrypt[26] = {0};
        int decrypt_len = 0;
        short cnt[128] = {0};
        pKey = key;
        
        char info[1000], *pInfo;
        scanf("%s", &info[0]);
        pInfo = info;
        
//         printf("%s\n", pKey);
//         printf("%s\n", pInfo);
        
        for(;*pKey;pKey++)
        {
            if(*pKey >= 'a' && *pKey <= 'z')
            {
                *pKey -= ('a' - 'A');
            }
            
            if(!cnt[*pKey])
            {
                cnt[*pKey]++;
                decrypt[decrypt_len++] = *pKey;
                alpbat[*pKey - 'A'] = 0;
            }
        }
        decrypt[decrypt_len] = '\0';
        
//         printf("%s\n", alpbat);
//         printf("%s\n", decrypt);
        
        for(int i = 0;i < 26;i++)
        {
            if(alpbat[i])
            {
                decrypt[decrypt_len++] = alpbat[i];
            }
        }
         decrypt[decrypt_len] = '\0';
        
//         printf("%s\n", alpbat);
//         printf("%s\n", decrypt);
        
        for(;*pInfo;pInfo++)
        {
            if(*pInfo >= 'a' && *pInfo <= 'z')
                printf("%c", decrypt[*pInfo - 'a'] + 'a' - 'A');
            else if(*pInfo >= 'A' && *pInfo <= 'Z')
                printf("%c", decrypt[*pInfo - 'A']);
        }
        printf("\n");
    }
    return 0;
}

上一题