📄 hill.cpp
字号:
#include<iostream.h>
#include <stdlib.h>
#include<math.h>
#include<cstring>
char Word[52]={'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','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'};
int LocateVex(char *W,char u)
{ int i;
for (i=0;i<52;i++)
{if (u==W[i])
return i;
}
if (i==52)
{ cout<<"Error !\n";
exit(1);
}
return 0;
}
void initial(int **&A,int row,int column)
{
A = (int**)malloc(sizeof(int)*(row+1));//分配空间
if(A == NULL)
{
cout<<"error\n";
exit(1);
}
for(int c=0; c< row+1; c++)
{
*(A+c) = (int*)malloc(sizeof(int)*(column+1));
if(A == NULL)
{
cout<<"error\n";
exit(1);
}
}
}
//求矩阵的行列式|A|
int line_row(int **A,int n)
{
int r,c,d,su=0,all;
int **C;
initial(C,n,n);
if(n>2)
{
for(r=1;r<=n;r++)
{
for(c=1;c<n;c++)
{
for(d=1;d<r;d++)
C[c][d]=A[c+1][d];
for(d=r;d<n;d++)
C[c][d]=A[c+1][d+1];
}
all=A[1][r]*line_row(C,n-1);
if(r%2==1)
su+=all;
else
su-=all;
}
return(su);
}
else
if(n==1)
return(A[1][1]);
else
if(n==2)
return(A[1][1]*A[2][2]-A[1][2]*A[2][1]);
}
//求矩阵乘法
void Mulab(int **a,int *b,int *c,int n)
{
int i,k;
for(i=1;i<=n;i++)
{
c[i-1]=0;
for(k=1;k<=n;k++)
c[i-1]+=a[i][k]*b[k-1];
}
}
//求两个数的最大公约数
int hfc(int w,int q)
{
int rr;
if(q>w)
{w=w+q;q=w-q;w=w-q;}
while((rr=w%q)!=0)
{
w=q;
q=rr;
}
return(q);
}
void main()
{
int row,column;
int **A,**B,**D,**E;
cout<<"输入矩阵的维数:\n";
cin>>row;
column=row;
initial(A,row,column);
initial(B,row,column);
initial(D,row,column);
initial(E,row,column);
int i,j,k,t,n,s=1,sum=0;
int r0,r1,r2,r3,r4,r5;
n=row;
for(i=0;i<=n;i++)
A[0][i]=0;
for(i=1;i<=n;i++)
A[i][0]=0;
cout<<"请输入矩阵A的值:\n";
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
cin>>A[i][j];
//*****************求矩阵的逆*****************************************
sum=line_row(A,n);
r1=sum%26; //求|A|^1 (mod26)的值
r2=(r1*r1)%26; //求|A|^2 (mod26)的值
r3=(r2*r2)%26; //求|A|^4 (mod26)的值
r4=(r3*r3)%26; //求|A|^8 (mod26)的值
r5=(r1*r2*r4)%26;//求|A|^11 (mod26)的值
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
{
for(k=1;k<i;k++)
{
for(t=1;t<j;t++)
B[k][t]=A[k][t];
for(t=j;t<n;t++)
B[k][t]=A[k][t+1];
}
for(k=i;k<n;k++)
{
for(t=1;t<j;t++)
B[k][t]=A[k+1][t];
for(t=j;t<n;t++)
B[k][t]=A[k+1][t+1];
}
if((i+j)%2==0)
D[j][i]=line_row(B,n-1);
else
D[j][i]=-line_row(B,n-1);
}
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
if(D[i][j]%hfc(abs(sum),26)==0)
{
r0=D[i][j]%26;
E[i][j]=(r0*r5)%26;
if(E[i][j]<0)
E[i][j]+=26;
}
}
}
//*****************求矩阵的逆*****************************************
int z,f,y,count=0;
int *X,*Y,*F,*G,*H,*J;
char *K,*L,M[100]={'\0'};
cout<<"请输入明文\n";
cin>>M;
z=strlen(M);
X=(int*)malloc(sizeof(int)*z);
Y=(int*)malloc(sizeof(int)*z);
F=(int*)malloc(sizeof(int)*n);
G=(int*)malloc(sizeof(int)*n);
H=(int*)malloc(sizeof(int)*n);
J=(int*)malloc(sizeof(int)*z);
K=(char*)malloc(sizeof(char)*z);
L=(char*)malloc(sizeof(char)*(z+n));
for(f=0;f<z;f++)
X[f]=LocateVex(Word,M[f]);
cout<<"加密的密文为:\n";
for(y=1,f=n;f<=z+n;f+=n,y+=n)
{
for (int a=1;a<=f-y+1;a++)
if(y-2+a<z)
F[a-1]=X[y-2+a];
else
F[a-1]='a';
Mulab(A,F,G,n);
for (a=0;a<n;a++)
{
// cout<<Word[G[a]%26];
L[count++]=Word[G[a]%26];
}
}
for (int a=0;a<z;a++)
{
cout<<L[a];
}
cout<<endl;
/* for(a=1;a<=n;a++)
{
for(int z=1;z<=n;z++)
cout<<E[a][z]<<" ";
cout<<endl;
}
*/
/* cout<<"密文还原的明文为:\n";
count=0;
for(y=1,f=n;f<=z;f+=n,y+=n)
{
for (int a=1;a<=f-y+1;a++)
H[a-1]=LocateVex(Word,L[count++]);
Mulab(E,H,J,n);
for (a=0;a<n;a++)
cout<<Word[J[a]%26];
}
*/ cout<<endl;
free(A);free(B);free(D);free(E);free(F);free(G);free(H);free(J);
free(K); free(L);
system("pause");
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -