洛谷B2612 加密的病历单

背景(我由于不知道如何在洛谷上交题解,就跑这来了,好啦,废话不多说了)

题目描述

小英是药学专业大三的学生,暑假期间获得了去医院药房实习的机会。

在药房实习期间,小英扎实的专业基础获得了医生的一致好评,得知小英在计算概论中取得过好成绩后,主任又额外交给她一项任务,解密抗战时期被加密过的一些伤员的名单。

经过研究,小英发现了如下加密规律(括号中是一个“原文 → 密文”的例子)

  1. 原文中所有的字符都在字母表中被循环左移了三个位置(bcd→yzabcd→yza)

  2. 逆序存储(abcd→dcbaabcd→dcba)

  3. 大小写反转(abXY→ABxyabXY→ABxy)

现在给出一个加密的字符串,请你将其解密

输入格式

一个加密的字符串。(长度小于 5050 且只包含大小写字母)

输出格式

输出解密后的字符串。

输入输出样例

输入 #1

GSOOWFASOq

输出 #1

Trvdizrrvj

解题思路:记得看清题目要求,输入时是加完密的,输出时 要求是解密的,那么第一个步骤就是把加完密的字符串都向后移三个第二个是反转字符串,你可以再定义一个字符串来存上一个字符串的倒序第三个就是将小写字母转化为大写字母,他们之间相差32哦(五颜六色,好看的很

提醒,在第二个步骤中再创一个字符串,需要用到这个s1.resize(s.length());,这行代码的意思就是开创一个字符串s1,它的大小与s一样大,对了我用的是string,别的就无需多言了,上代码

#include <iostream>  
#include <string>  
using namespace std;  
int main() 
{ 
    string s,s1; 
	int k=0; 
   	cin>>s;  
	s1.resize(s.length());
    for (int i = 0; i < s.size(); i++) //第一个for循环是用来使所有字符都向后移三个
	{  
       	if(s[i]>='a'&&s[i]<='w')
       		s[i]=s[i]+3;
       	else if(s[i]=='x') 
		   s[i]='a';
       	else if(s[i]=='y') 
		   s[i]='b';
       	else if(s[i]=='z') 
		   s[i]='c';
   		else if(s[i]>='A'&&s[i]<='W')
   			s[i]=s[i]+3;
       	else if(s[i]=='X') 
		   s[i]='A';
       	else if(s[i]=='Y') 
		   s[i]='B';
       	else if(s[i]=='Z') 
		   s[i]='C';
    }
    for(int i=s.size()-1;i>=0;i--)//第二个for循环是 实现翻转功能
    	s1[k++]=s[i];
    for(int i=0;i<k;i++)//第三个for循环是实现大小写转化
    {
    	if(s1[i]>='a'&&s1[i]<='z')
    		s1[i]-=32;
    	else if(s1[i]>='A'&&s1[i]<='Z')
    		s1[i]+=32;
	}
    cout << s1 << endl;  
    return 0;  
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值