您的位置:首页 > 其它

华为oj 字符串加密

2017-07-18 10:04 190 查看


题意总体上分为三步:

1.对秘钥进行去重

2.对秘钥根据字母表中剩余数字进行补齐,保证秘钥最后长度一定是26个字母

3.需加密字符串根据秘钥进行加密,加密需要注意两点,一个是保持原字符串的大小写,还有一个就是加密规则,原来处于某位置上的字母变成秘钥上此位置的字母,如题目需要加密的字符串Attack AT DAWN ,第一个字母A在正常字母表中的位置是1,所以我们找到秘钥第一个位置T(注意:空格是要保留的)。

下面说说我的具体实现思路

声明两个长度为26的数组一个int类型的Count数组,一个char类型的encrypt数组,Count是用来去重的,此元素第一次出现,此位置变为1,encrypt数组记录秘钥,之后,根据秘钥进行加密就好,代码如下。

#include<stdio.h>
#include<string.h>
#define M 200

void encrypt(char * key, char * data, char * encrypt);

void encrypt(char * key, char * data, char * encrypt)
{
int count[26] = { 0 };
char encrypt_book[26] = { 0 };
int length_key = 0;
int length_data = 0;
int i = 0;
int temp = 0;

//输入字符串去除重复,并且以大写形式保存
//去重算法可以通过另设一个数组,专门用来记录是否重复的信息;
 length_key = strlen(key);
for (i = 0; i < length_key; i++)
{
if (key[i] >='a' && key[i] <= 'z')
{
if (count[key[i] - 'a'] == 0)
{
count[key[i] - 'a'] = 1;
encrypt_book[temp] = key[i] - 'a' + 'A';
temp++;
}

}
else if (key[i] >= 'A' && key[i] <= 'Z')
{
if (count[key[i] - 'A'] == 0)
{
count[key[i] - 'A'] = 1;
encrypt_book[temp] = key[i];
temp++;
}

}
}
//字母表补齐
for (i = 0; i < 26; i++)
{
if (count[i] == 0)
{
encrypt_book[temp] = 'A' + i;
temp++;
}
}
//加密
length_data = strlen(data);
for (i = 0; i < length_data; i++)
{
if (data[i] >= 'a' && data[i] <= 'z')
{
encrypt[i] = encrypt_book[data[i] - 'a'] - 'A' +'a';
}
else if (data[i] >= 'A' && data[i] <= 'Z')
{
encrypt[i] = encrypt_book[data[i] - 'A'];
}
else
{
encrypt[i] = ' ';
}
}

}
void main(void)
{

char data[M] = "Attack AT DAWN";
char key[M] = "TRAILBLAZERS";
char encrypt1[M] = { 0 };
// scanf("%s %s", key, data);//提交时需要这样输入
encrypt(key, data, encrypt1);
puts(encrypt1);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: