最近花了五天时间把the C. programming language看了一遍,今天开始刷题。这道题讲的是各处密钥key和密文,已知加密公式,求出原文。题很水,只要把加密公式反过来就行了。
#include<stdio.h>
#include<string.h>
int main()
{
void changetonum(char ci[],int len);
void numtochar(char pl[],int len);
int i,j,k;
scanf("%d",&k);
while(k!=0)
{
char ci[100],pl[100];
int len;
scanf("%s",ci);
len=strlen(ci);
changetonum(ci,len);
for(i=0;i<len;i++)
{
pl[k*i%len]=(ci[i]+i)%28;
}
pl[i]='\0';
numtochar(pl,len);
puts(pl);
scanf("%d",&k);
}
}
void changetonum(char ci[],int len)
{ //该函数用于把密文转化为数字
int i;
for(i=0;i<len;i++)
{
if(ci[i]>='a'&&ci[i]<='z')
{
ci[i]=ci[i]-'a'+1;
}
else if(ci[i]=='_')ci[i]=0;
else if(ci[i]=='.')ci[i]=27;
}
}
void numtochar(char pl[],int len)
{ //用于把解密后的数字转化为原文
int i;
for(i=0;i<len;i++)
{
if(pl[i]>=1&&pl[i]<=26)pl[i]=pl[i]+'a'-1;
else if(pl[i]==0)pl[i]='_';
else if(pl[i]==27)pl[i]='.';
}
}
要特别注意的是一定要用一个变量len记录原字符串长度,因为在转换过程中可能会出现0('_'对应的数字就是0),这样的话调用strlen函数就无法得出正确的长度。
posted on 2011-08-13 16:14
小鼠标 阅读(257)
评论(0) 编辑 收藏 引用