凯撒密码
- 加密即把a-z或A-Z的字母向后移动n个字符实现加密,若n=3的话,a对应d,z对应c,如此循环;
- 解密刚好和加密相反,加密向后移动的话解密就向前移动。
加密的C代码如下:
#include <stdio.h>
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 <stdio.h>
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;
}