⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hill.cpp

📁 HILL PROGRAMMING COURSE DESIGN FOR CRY-COURSE
💻 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 + -