U59863 费纳姆密码(简单版)题解

· · 题解

#include<iostream>
#include<string>
using namespace std;

string m[26]={"1000001","1000010","1000011","1000100","1000101","1000110","1000111","1001000","1001001","1001010","1001011","1001100","1001101","1001110","1001111","1010000","1010001","1010010","1010011","1010100","1010101","1010110","1010111","1011000","1011001","1011010"};    //存储26个字母的二进制

void jm1(string a,string b)
{
    int i,j,l=a.length();
    string k[l],h[l],p[l];
    for(i=0;i<l;i++)
    {
        k[i]=m[a[i]-'A'];
        h[i]=m[b[i]-'A'];
        p[i]=m[b[i]-'A'];
    }
    for(i=0;i<l;i++)
    {
        for(j=0;j<7;j++)
        {
            p[i][j]=k[i][j]+h[i][j]-'0';
            if(p[i][j]=='2')  p[i][j]='0';
        }
    }
    for(i=0;i<l;i++)
    {
        cout<<p[i];
    }
}

void jm2(string a,string b)
{
    int i=0,j=0,l=b.length(),g=a.length();
    string p[l],h[l],k[l];
    for(i=0;i<l;i++)
    {
        while(j<(i+1)*7)
        {
            p[i]+=a[j];
            j++;
        }
    }
    for(i=0;i<l;i++)
    {
        h[i]=m[b[i]-'A'];
        k[i]=m[b[i]-'A'];
    }
    for(i=0;i<l;i++)
    {
        for(j=0;j<7;j++)
        {
            k[i][j]=p[i][j]-h[i][j]+'0';
            if(k[i][j]<'0')  k[i][j]='1';
        }
    }
    for(i=0;i<l;i++)
    {
        for(j=0;j<26;j++)
        {
            if(k[i]==m[j])
            {
                char t=j+'A';
                cout<<t;
            }
        }
    }
}

int main()
{
    int s,i;
    string x,y;
    cin>>s>>x>>y;
    if(s==1)    //判断工作类型(1或2)
    {
        jm1(x,y);   //执行加密
    }
    else
    {
        jm2(x,y);   //执行解密
    }
    return 0;
}