OpenJudge百炼习题解答(C++ )--题4112:情报破译-Cryptanalysis

题:

总时间限制:1000ms     内存限制:65536kB
描述

A国和B国正在进行一场战争。A国通过间谍知道B国的情报加密规则为:

1.    仅对字母加密,其他符号保留(如空格,逗号等)

2.    对第i个单词(i从1开始)的加密方法是把第i个单词反转(如abc变成cba),然后对单词内的每个字母采用经典的Caesar加密法,循环后移i个字母。例如:第5个单词的加密表如下所示:

密码字母:A B C D E F G H I J K L M N O P Q R S T U VW X Y Z

原文字母:V W X Y Z A B C D E F G H I J K L M N O P QR S T U

3.       单词的定义是:任何一串极大的连续字母串。

比如,样例输出第三行,第二个单词为ba,反转后为ab,a后移2个单词变成c,b后移两个单词变成d,故该单词加密后为cd(见样例输入第三行)。

现在A国又截获了一些B国的情报密文。请你帮A国破译出情报的内容。

输入
一共有不超过int范围行,每行为一个字符串(int范围)。注意,每行是可以以空格开头的。
输出
情报破译后得到的内容。每条情报对应输出一行。
样例输入:

样例输出:                

解:

#include<iostream>
#include<stdio.h>

#include<string>

using namespace std;
void Tra(string A);
char Cc(int n,char c);
int main()
{
	int Line=0;
	int count=0;
	int Len;



	string A[65536];
/*	while(true)
	{
		count++;
		Len=0;
getline(cin,A[count-1]);

	
		
	while(A[count-1][Len++]);
	if(A[count-1][Len-2]!='.')
	{
	
		break;
	}	
	
	}
	
	for(int i=0;i<count;i++)
	{
	Tra(A[i]);
	}
	
	*/
	for(int i=0;i<65536;i++)
	{
		count=i;
	getline(cin,A[count]);	
	Tra(A[count]);
		
	}
	


	return 0;
 } 
 
 
 
 
 
 
 
 
 
 
 
 
 void Tra(string A)
 {
 	
 	
 	
 	int F=-1;
 	int L=-1;
 	int InWord=0;
 
 	char Temp;
 	int Count=0;
 	int i=0;
 	while(A[i])
 	{
	
 		if(InWord==0&&   (  ( A[i]>=97&&A[i]<=122)  ||  (A[i]>=65&&A[i]<=90)  )  )
         {
         	InWord=1;
         	Count++;
         	F=i;
         	


  
		 }
		 if(InWord==1&&( A[i]>122 || A[i]<65 || (A[i]>90&&A[i]<97) ) )
		 {InWord=0;
		 	L=i;
		 	
		 	
		 
		 	
		 
		 }
		 if(InWord==1&&(A[i]<=122&&A[i]>=97||A[i]>=65&&A[i]<=90)&&A[i+1]==0)
		 {
		 	InWord=0;
		 	L=i+1;
		 }

		
		 if(F!=-1&&L!=-1)
		 {
		 
		 for(int h=0;h<(L-F)/2;h++)
		 {
	
		    Temp=A[F+h];
		 	A[F+h]=A[L-h-1];
		 	A[L-h-1]=Temp;
		 	
		 }
	
		 
		 for(int h=0;h<(L-F);h++)
		 {
		 	A[F+h]=Cc(Count,A[F+h]);
	
		 }
		 F=-1;
		 L=-1;
	}
	 i++;
	 }
	 
	 
	 
	 cout<<A<<endl;
 }
 
 
 
 
 
 
 char Cc(int n,char c)
 {
 if(c>=97&&c<=122)
 {
 if(c-n>=97)
 {
 	return c-n;
 }
 else
 {
 	return 'z'-(96+n-c);
 }
 }
 		
if(c>=65&&c<=90)
{
	if(c-n>=65)
	{
		return c-n;
	}
	else
	{
		return 'Z'-(64+n-c);
	}
}
 }

推荐文章:那些年,做的几个应用


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值