最近花了五天时间把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)  编辑 收藏 引用

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


<2012年2月>
2930311234
567891011
12131415161718
19202122232425
26272829123
45678910

常用链接

随笔分类(111)

随笔档案(127)

friends

最新评论

  • 1. re: 线段树
  • 是这个样子的,所以在OJ有时候“卡住”了也不要太灰心,没准真的不是自己的原因呢。
    加油,祝你好运啦!
  • --小鼠标
  • 2. re: 线段树
  • 对于编程竞赛来说,Java所需时间一般为C/C++的两倍。合理的竞赛给Java的时间限制是给C/C++的两倍。
  • --伤心的笔
  • 3. re: poj1273--网络流
  • 过来看看你。
  • --achiberx
  • 4. re: (转)ubuntu11.10无法启动无线网络的解决方法
  • 膜拜大神。。查了一个下午资料终于在这里解决了问题。。神牛说的区域赛难道是ACM区域赛。。?
  • --Hang
  • 5. re: 快速排序、线性时间选择
  • 博主,谢谢你的文章。你的方法可以很好的处理分区基准在数组中重复的情况,书上的方法遇到这种输入会堆栈溢出。书上给出了解释但给的方法貌似不简洁。
  • --lsxqw2004

阅读排行榜