[編程題]字符串加密

[編程題]字符串加密

有一種技巧可以對數據進行加密,它使用一個單詞作爲它的密匙。下面是它的工作原理:首先,選擇一個單詞作爲密匙,如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;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章