南邮 OJ 1661 凯撒密码

凯撒密码

时间限制(普通/Java) :  1000 MS/ 3000 MS          运行内存限制 : 65536 KByte
总提交 : 643            测试通过 : 35 

比赛描述

尤利乌斯?凯撒生活在一个充满战争与阴谋的时代,敌人们在他身边安插了无数间谍,时刻监视着他的一举一动。为了让自己的军事部署不被泄露,凯撒发明了一套密码用来与自己的将军们通信。

凯撒密码的加密方式如下:首先将原文中的每个字母改写为字母表中在其之后的第N个字母,若超出了字母表的范围则回到字母‘a’继续计数。比如N=1时就把原文中的‘a’全部改写为‘b’,‘b’改写为‘c’……而把‘z’改写为‘a’。完成这一步后,再将此时密文中所有的字符向后推M位(最后的M个字符放到开头),加密工作就完成了。现在给出NM和密文,请你还原出加密前的原文。




输入

输入数据有多组,每组数据的第一行给出NM|N||M|<=10),之后一行给出加密后的文本,密文仅含大小写英文字母以及空格‘ ’、逗号‘,’、句号‘.’这三种字符。数据保证加密前原文以字母开头,以句号结束,长度不超过100个字符。

输出

    每组数据输出一行解密后得到的原文,输出时要求答案中每句话(以句号为结束符)的第一个字母大写,其余所有字母小写。

样例输入

2 2
U.Kp yct, gxgpvu qh korqtvcpeg ctg vjg tguwnv qh vtkxkcn ecwug

样例输出

In war, events of importance are the result of trivial causes.

提示

undefined

题目来源

lithium





#include<iostream>
#include<string>
using namespace std;

int main(){
	int N, M, i, len;
	string s;
	while(cin>>N>>M){
		getchar();
		getline(cin,s);
		len = (int)s.length();
		while(N<0){
			N += 26;
		}
		N %= 26;
		while(M<0){
			M += len;
		}
		M %= len;
		s = s.substr(M,len-M) + s.substr(0,M);
		for(i=0; i<len; i++){
			if(s[i]>='a' && s[i]<='z'){
				s[i] = (s[i]-'a'+26-N)%26 + 'a'; 
			}else if(s[i]>='A' && s[i]<='Z'){
				s[i] = (s[i]-'A'+26-N)%26 + 'a';	//先全部转为小写
			}
		}
		bool headFlag = 1;
		for(i=0; i<len; i++){
			if(headFlag && s[i]>='a' && s[i]<='z'){
				s[i] += 'A'- 'a';
				headFlag = 0;
			}
			if(!headFlag && s[i]=='.'){
				headFlag = 1;
			}
		}
		cout<<s<<endl;
	}
}



你可能感兴趣的:(ACM,凯撒密码,南邮OJ)