1604 - 简单密码

Julius Caesar曾经使用过一种很简单的密码。

对于明文中的每个字符,将它用它字母表中后5位对应的字符来代替,这样就得到了密文。
比如字符A用F来代替。如下是密文和明文中字符的对应关系。
密文
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
明文
V W X Y Z A B C D E F G H I J K L M N O P Q R S T U 
你的任务是对给定的密文进行解密得到明文。
你需要注意的是,密文中出现的字母都是大写字母。密文中也包括非字母的字符,对这些字符不用进行解码。

题目输入

输入中的测试数据不超过100组。每组数据都有如下的形式,而且各组测试数据之间没有空白的行。

一组测试数据包括三部分:
1.    起始行 - 一行,包括字符串 "START" 
2.    密文 - 一行,给出密文,密文不为空,而且其中的字符数不超过200
3.    结束行 - 一行,包括字符串 "END" 
在最后一组测试数据之后有一行,包括字符串 "ENDOFINPUT"。

题目输出

对每组数据,都有一行输出,给出密文对应的明文。

输入/输出样例

题目输入

START
SBEGG,SEHVSENBVSNGFVNAER  GB,ST;L'G;A';;]GSAEH
END
START
GHSAERHBDRBTM   JTFI7869IOOG.FKJSAJHSTRJ
END
ENDOFINPUT

题目输出

NWZBB,NZCQNZIWQNIBAQIVZM  BW,NO;G'B;V';;]BNVZC
BCNVZMCWYMWOH   EOAD7869DJJB.AFENVECNOME

C语言解答

#include<stdio.h>
#include<string.h>
#include<math.h>
int main()
{
  int n,i,j,k,len;
  char  a[105],b[205],c[105],d[20]="ENDOFINPUT";
  for(i=0;;i++)
  {
	  len=0;
	  gets(a);
	  if(strcmp(a,d)==0)  return 0;
	  gets(b);
	  len=strlen(b);
	  gets(c);
	  for(j=0;j<len;j++)
	 { if(b[j]>='A'&&b[j]<='E') b[j]=b[j]+21;
	  else if(b[j]>='F'&&b[j]<='Z')  b[j]=b[j]-5;}
	puts(b);
	
  }
  return 0;


}

C++解答

#include<cstdio>
#include<cstdlib>
#include<cstring>
using namespace std;
const int maxn=200+5;
char str[maxn];
char a[maxn],b[maxn];

int main()
{
    while(gets(a))
    {
        if(strcmp(a,"ENDOFINPUT")==0)
         break;
        else if(strcmp(a,"START")==0)
        {
            gets(str);
            gets(b);
            int len=strlen(str);
            for(int i=0;i<len;i++)
            if(str[i]>='F'&&str[i]<='Z')
            str[i]=str[i]-5;
            else if(str[i]<='E'&&str[i]>='A')
            str[i]='Z'+(str[i]-'A')-4;
        }
        printf("%s\n",str);
    }
    return 0;
}
时间限制 1 秒
内存限制 32 MB
讨论 统计
上一题 下一题