U59863 费纳姆密码(简单版)题解
O2算法工程师
·
·
题解
#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;
}