这道题读起来挺拗口的,但是仔细理解下你就会发现题意总体上分为三步:
1.对秘钥进行去重
2.对秘钥根据字母表中剩余数字进行补齐,保证秘钥最后长度一定是26个字母
3.需加密字符串根据秘钥进行加密,加密需要注意两点,一个是保持原字符串的大小写,还有一个就是加密规则,原来处于某位置上的字母变成秘钥上此位置的字母,如题目需要加密的字符串Attack AT DAWN ,第一个字母A在正常字母表中的位置是1,所以我们找到秘钥第一个位置T。
下面说说我的具体实现思路(我很喜欢用长度为26的数组!!!)
声明两个长度为26的数组一个bool类型的Count数组,一个char类型的encrypt数组,Count是用来去重的,此元素第一次出现,此位置变为true,encrypt数组记录秘钥,之后,根据秘钥进行加密就好,代码如下。
#include<iostream>
#include<string>
using namespace std;
bool Count[26] = { false };
char encrypt[26] = { 0 };
int main()
{
string key, data;
cin >> key >> data;
int c = 0;
//输入字符串去重,转化成大写插入
for (int i = 0; i < key.length(); i++)
{
if (key[i] >= 'a'&&key[i] <= 'z')
{
if (!Count[key[i] - 'a'])
{
Count[key[i] - 'a'] = true;
encrypt[c] = key[i] - 'a' + 'A';
c++;
}
}
else if (key[i] >= 'A'&&key[i] <= 'Z')
{
if (!Count[key[i] - 'A'])
{
Count[key[i] - 'A'] = true;
encrypt[c] = key[i];
c++;
}
}
else
{
return 0;
}
}
//字母表剩余的补齐
for (int j = 0; j < 26; j++)
{
if (!Count[j])
{
encrypt[c] = 'A' + j;
c++;
}
}
//加密
for (int k = 0; k < data.length(); k++)
{
if (data[k] >= 'a'&&data[k] <= 'z')
{
data[k] = encrypt[data[k] - 'a'] - 'A' + 'a';
}
else if (data[k] >= 'A'&&data[k] <= 'Z')
{
data[k] = encrypt[data[k] - 'A'];
}
}
cout << data << endl;
return 0;
}