[編程題]字符串加密
有一種技巧可以對數據進行加密,它使用一個單詞作爲它的密匙。下面是它的工作原理:首先,選擇一個單詞作爲密匙,如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。
請實現下述接口,通過指定的密匙和明文得到密文。
詳細描述:
接口說明
原型:
voidencrypt(char * key,char * data,char * encrypt);
輸入參數:
char * key:密匙
char * data:明文
輸出參數:
char * encrypt:密文
返回值:
void
輸入描述:
先輸入key和要加密的字符串
輸出描述:
返回加密後的字符串
輸入例子:
nihao
ni
輸出例子:
le
解題思路
兩步:
1、取得key(去重 + 字母補齊) 2、匹配出密文
AC代碼如下:
#include <iostream>
#include <string>
using namespace std;
string Sample( string str )
{
string str2;
for( int i = 0; i < str.length(); ++i )
{
if( str2.find(str[i]) == string::npos )
{
str2.push_back(str[i]);
}
}
return str2;
}
int main()
{
string key, str;
while( cin>>key )
{
cin>>str;
/*key去重*/
key = Sample(key);
string str1 = "abcdefghijklmnopqrstuvwxyz";
string str2 = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
if( key[0]>='a' && key[0]<='z' )
{
/* 按字母順序填充key */
for( int i = 0; i < str1.length(); ++i )
{
if( key.find(str1[i]) == string::npos )
{
key.push_back(str1[i]);
}
}
/* 匹配並輸出密文 */
for( int j = 0; j < str.length(); ++j )
{
for( int i = 0; i < str1.length(); ++i )
{
if( str[j] == str1[i] )
{
cout<<key[i];
}
}
}
}/* 同上 */
else if( key[0]>='A' && key[0]<='Z' )
{
for( int i = 0; i < str2.length(); ++i )
{
if( key.find(str2[i]) == string::npos )
{
key.push_back(str2[i]);
}
}
for( int j = 0; j < str.length(); ++j )
{
for( int i = 0; i < str2.length(); ++i )
{
if( str[j] == str2[i] )
{
cout<<key[i];
}
}
}
}
cout<<endl;
}
return 0;
}