凯撒密码
#include
void encode(char str[],int n)
{
//使用两个数组分别存放大小写字符
char min[26]={'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'};
char max[26]={'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 i,k,m;
for(i=0;str[i]!='\0';i++)//判空条件也可以使用strlen(str)来获取str长度实现
{
if('a'<=str[i] && str[i]<='z')
{
k=str[i]-'a';//使用k来获得当前字符对于字符a的偏离程度。若当前字符为a,则k=0,刚好符合字符数组min的下标
m=(26+k+n)%26;//使用m来保存移动后的字符,对26取余数保证m始终位于0至25之间。若n为复数的话k+n可能小于0,因此在前面加上26保证其为正数。
str[i]=min[m];
}
else if('A'<=str[i] && str[i]<='Z')
{
k=str[i]-'A';
m=(26+k+n)%26;
str[i]=max[m];
}
}
}
int main()
{
char a[10],ch;
int n;
printf("输入n值:");
scanf("%d",&n);
ch=getchar();
printf("\n输入原始字符串:");
gets(a);
encode(a,n);
printf("\n转换后:");
puts(a);
return 0;
}
解密的C代码如下:
#include
void decode(char str[],int n)
{
//使用两个数组分别存放大小写字符
char min[26]={'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'};
char max[26]={'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 i,k,m;
for(i=0;str[i]!='\0';i++)//判空条件也可以使用strlen(str)来获取str长度实现
{
if('a'<=str[i] && str[i]<='z')
{
k=str[i]-'a';//使用k来获得当前字符对于字符a的偏离程度。若当前字符为a,则k=0,刚好符合字符数组min的下标
m=(26+k-n)%26;//使用m来保存移动后的字符,由于k-n可能为负数因此在前面加上26保证其为正数。
str[i]=min[m];
}
else if('A'<=str[i] && str[i]<='Z')
{
k=str[i]-'A';
m=(26+k-n)%26;
str[i]=max[m];
}
}
}
int main()
{
char a[10],ch;
int n;
printf("输入n值:");
scanf("%d",&n);
ch=getchar();
printf("\n输入原始字符串:");
gets(a);
decode(a,n);
printf("\n转换后:");
puts(a);
return 0;
}