題目描述
有一種技巧可以對資料進行加密,它使用一個單詞作為它的密匙。下面是它的工作原理:首先,選擇一個單詞作為密匙,如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和要加密的字元串
輸出描述:
傳回加密後的字元串
示例1
輸入
nihao
ni
輸出
le
解題思路:
1、定義字母表:string s=“abcdefghijklmnopqrstuvwxyz”
2、先将密鑰中重複字元去掉,得到s1;
3、将s1放入加密後的字母表前面,得到s2;
4、在s中尋找輸入的明文str出現的位置,在s2中尋找對應字母,存在s3中;
5、輸出s3
代碼:
#include<iostream>
#include<algorithm>
#include<string>
using namespace std;
int main()
{
string key;
string s="abcdefghijklmnopqrstuvwxyz";
while(cin>>key)
{
string s1,s2,s3;//s1:去重後的密鑰。s2:加密後的字母表。s3:密文
string str;//輸入的明文
cin>>str;
for(int i=0;i<key.length();i++)//輸入字元串去重
{
int n=s1.find(key[i]);
if(n==-1)
{
s1+=key[i];
}
}
//cout<<s1<<endl;
s2+=s1;//将去重後的密鑰放到加密字母表的前面
for(int i=0;i<s.length();i++)//構造加密字母表
{
int n=s2.find(s[i]);
if(n==-1)
{
s2+=s[i];
}
}
//cout<<s2<<endl;
for(int i=0;i<str.length();i++)
{
int n=s.find(str[i]);
s3+=s2[n];
}
cout<<s3<<endl;
}
}
牛客網編譯器所有例子運作正确