#include<stdio.h>#include<string.h>
//辗转相除求最大公因子
int gcd(int a,int b)
{
int k=0;
do
{
k=a%b;
a=b;
b=k;
}while(k!=0);
return a;
}
//求解a相对于b的逆元
int ni(int a,int b)
{
int i=0;
while(a*(++i)%b!=1);
return i;
}
//加密函数
void jia()
{
char c[100];
int len,ka,kb;
printf("请输入原文\n");
gets(c);
len=strlen(c);
printf("请输入秘钥\n");
scanf("%d%d",&ka,&kb);
//秘钥ka,kb必须互素
while(gcd(ka,kb)!=1)
{
printf("秘钥错误,请重新输入:\n");
scanf("%d%d",&ka,&kb);
}
for(int i=0;i<len;i++)
{
if(c[i]>=97&&c[i]<=122)
c[i]=(ka*(c[i]-97)+kb)%26+97;
else if(c[i]>=65&&c[i]<=90)
c[i]=(ka*(c[i]-65)+kb)%26+65;
}
printf("%s\n",c);
}
//解密函数
void jie()
{
char c[100];
int ka,kb,len,tmp;
printf("请输入原文\n");
gets(c);
len=strlen(c);
printf("请输入秘钥\n");
scanf("%d%d",&ka,&kb);
while(gcd(ka,kb)!=1)
{
printf("秘钥输入错误,请重新输入:\n");
scanf("%d%d",&ka,&kb);
}
for(int i=0;i<len;i++)
{
if(c[i]>=65&&c[i]<=90)
{
tmp=ni(ka,26)*(c[i]-65-kb);
if(tmp<0)
c[i]=tmp%26+26+65;
else
c[i]=tmp%26+65;
}
if(c[i]>=97&&c[i]<=122)
{
tmp=ni(ka,26)*(c[i]-97-kb);
if(tmp<0)
c[i]=tmp%26+26+97;
else
c[i]=tmp%26+97;
}
}
printf("%s\n",c);
}
int main()
{
int i;
printf("1.加密\n2.解密\n");
scanf("%d",&i);
while(i>0&&i<=3)
{
if(i==1)
jia();
else if(i==2)
jie();
}
return 0;
//辗转相除求最大公因子
int gcd(int a,int b)
{
int k=0;
do
{
k=a%b;
a=b;
b=k;
}while(k!=0);
return a;
}
//求解a相对于b的逆元
int ni(int a,int b)
{
int i=0;
while(a*(++i)%b!=1);
return i;
}
//加密函数
void jia()
{
char c[100];
int len,ka,kb;
printf("请输入原文\n");
gets(c);
len=strlen(c);
printf("请输入秘钥\n");
scanf("%d%d",&ka,&kb);
//秘钥ka,kb必须互素
while(gcd(ka,kb)!=1)
{
printf("秘钥错误,请重新输入:\n");
scanf("%d%d",&ka,&kb);
}
for(int i=0;i<len;i++)
{
if(c[i]>=97&&c[i]<=122)
c[i]=(ka*(c[i]-97)+kb)%26+97;
else if(c[i]>=65&&c[i]<=90)
c[i]=(ka*(c[i]-65)+kb)%26+65;
}
printf("%s\n",c);
}
//解密函数
void jie()
{
char c[100];
int ka,kb,len,tmp;
printf("请输入原文\n");
gets(c);
len=strlen(c);
printf("请输入秘钥\n");
scanf("%d%d",&ka,&kb);
while(gcd(ka,kb)!=1)
{
printf("秘钥输入错误,请重新输入:\n");
scanf("%d%d",&ka,&kb);
}
for(int i=0;i<len;i++)
{
if(c[i]>=65&&c[i]<=90)
{
tmp=ni(ka,26)*(c[i]-65-kb);
if(tmp<0)
c[i]=tmp%26+26+65;
else
c[i]=tmp%26+65;
}
if(c[i]>=97&&c[i]<=122)
{
tmp=ni(ka,26)*(c[i]-97-kb);
if(tmp<0)
c[i]=tmp%26+26+97;
else
c[i]=tmp%26+97;
}
}
printf("%s\n",c);
}
int main()
{
int i;
printf("1.加密\n2.解密\n");
scanf("%d",&i);
while(i>0&&i<=3)
{
if(i==1)
jia();
else if(i==2)
jie();
}
return 0;
}
如若有不正确的地方,欢迎各位大牛指正,不胜感激!