描述:有一種技巧可以對數據進行加密,它使用一個單詞作爲它的密匙。下面是它的工作原理:首先,選擇一個單詞作爲密匙,如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
知識點: 字符串
題目來源: 內部整理
練習階段: 初級
運行時間限制: 10Sec
內存限制: 128MByte
輸入:先輸入key和要加密的字符串
輸出:返回加密後的字符串
樣例輸入:
nihao
ni
樣例輸出: le
源程序:
#include<iostream>
#include<cstring>
using namespace std;
#define M 100
int main()
{
char key[M],data[M],encrypt[M];
void Encrypt(char *key,char *data,char *encrypt);
gets(key);
gets(data);
Encrypt(key,data,encrypt);
cout<<encrypt<<endl;
return 0;
}
void Encrypt(char *key,char *data,char *encrypt)
{
char keych[M];
keych[0]=key[0];
int i,j=0,k=0,flag;
for(i=0;key[i]!='\0';i++)//把已去掉密鑰中重複字符的密鑰賦給keych[],
{
flag=1;
for(k=0;k<j+1;k++)
{
if(key[i]==keych[k])
flag=0;
}
if(flag)
{
j=j+1;
keych[j]=key[i];
}
}
int len;
len=j+1;//keych的長度
char Alph[27]="ABCDEFGHIJKLMNOPQRSTUVWXYZ";
for(i=0;Alph[i]!='\0';i++)//keych[]補全,長度爲26
{
flag=1;
for(k=0;k<len;k++)
{
if(Alph[i]==keych[k])
flag=0;
if(Alph[i]==keych[k]-32)
{
keych[k]=keych[k]-32;flag=0;
}
}
if(flag)
{
keych[len]=Alph[i];
len=len+1;
}
}
keych[len]='\0';
i=0;k=0;
while(data[i]!='\0')//明文轉換爲密文
{
if((data[i]>='A'&&data[i]<='Z')||(data[i]>='a'&&data[i]<='z'))
{
for(j=0;j<26;j++)
{
if((data[i]==Alph[j])||(data[i]-32==Alph[j]))
{
if(data[i]>='A'&&data[i]<='Z')
encrypt[k]=keych[j];
else
encrypt[k]=keych[j]+32;
break;
}
}
}
else
encrypt[k]=data[i];
i=i+1;k=k+1;
}
encrypt[k]='\0';
}
鄙視我自己,只會用for和while循環,真是木有辦法。
運行結果:
每一次都只能用很笨的辦法,才能解決這些問題。知識面太窄了嗎?