大佬查错!!

加密的病历单

Problem ID: 9414

Contest ID: 5320

必做题

Wrong Answer

60 分

【题目描述】

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

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

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

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

2.逆序存储(abcd → dcba )

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

【数据格式】

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

输出解密后的字符串。

样例输入:

GSOOWFASOq

样例输出:

Trvdizrrvj

2 个赞

这是代码

#include<bits/stdc++.h>
using namespace std;
int main(){
    string a;
    cin>>a;
    //大小写反转
    for(int i=0;i<a.size();i++){
    	if(isupper(a[i])){
    		a[i]+=32;
		}
		else{
			a[i]-=32;
		}
	} 
    //逆序存储
    for(int i=0,j=a.size()-1;i<j;i++,j--){
    	swap(a[i],a[j]);
	}
    //右移了三个位置
    for(int i=0;i<a.size();i++){
    	if(a[i]+3<='z'){
    		a[i]+=3;	
		}
		else{
			a[i]-=23;
		}
	}
	//输出 
	cout<<a;
    return 0;
}```
3 个赞

你的逆序存储出错了。当i>a.size()/2,j<a.size()/2时,你又把它们换回来了。 就像

string a="abcdef"
1  =>   fbcdea
2  =>   fecdba
3  =>   fedcba
4  =>   aedcbf
5  =>   abdcef
6  =>   abcdef
“更多”做法

这里有一种很不符合逻辑的做法
已知这三步只是对单个字符进行操作,没有多字符同时操作。
那么,我们就可以将逆序存储放在最后,变为逆序输出,使得总顺序变为 大小写转换→右移三位→输出。
(至于逆序输出,我猜你应该会,就不多赘述了)

3 个赞

《猜你应该会》

2 个赞