杭州X01 第一次OI讲解(2)
2023-08-08 22:05:32
发布于:上海
上次发了我们X01 OI的三道题,接下来的两道题是最难的,也是最复杂的
这里还是只有一道题哦
我们直接进入讲题环节
首先进入我们每次都出难题的王老师的题Macw's Code
考点: 这道题考查对ascii码的操作,以及对中途截取加反转的考察
那么这道题是很有难度的:
解析:这道题首先说明要输入带空格的字符,那么大家可以看我之前发的帖子,
重点来了:
关于要提取单词,我们要新建一个string空变量cha来存放一个个单词以及一个cnt=0变量来记录位置
随后,当我们判断到cnt到了末尾,我们就需要最后对cha字符串进行反转
反转推荐采用上次说的reverse函数
或者说如果我们的原字符串的第cnt位子上是“ ”,那就把cha字符串拼接到保存改变后字符串的末尾(不要忘了填补空格)
当然,反转完也要拼接到另一个字符串末尾哦
最后又是我们的转ascii环节:
转字符ascii码是一件很复杂的事:这里把大小写转换的代码发一下,有需要的同学可以保存:
//大写字母转换
if (cha[i] >= 'A' and cha[i] <= 'Z'){
cout<<char((cha[i] + n - 65)%26 + 65);
//小写字母转换
else if (cha[i] >= 'a' && cha[i] <= 'z'){
cout<<char((cha[i] + n - 97)%26 + 97);
}
这里解释一下:26是因为有二十六个字母,97和65分别是A 和 a的ascii码
进行转换后可以直接输出,无需再进行保存
那下面的是代码:
#include<bits/stdc++.h>
using namespace std;
int main(){
string k;
getline(cin,k);
string cha="",c="";
int len=k.size();
for(int i=0;i<len;i++){
if(k[i]!=' '){
c+=k[i];
}
else{
reverse(c.begin(),c.end());
cha+=c;
cha+=" ";
c="";
}
if(i==len-1){
reverse(c.begin(),c.end());
cha+=c;
break;
}
}
int n;
cin>>n;
for(int i=0;i<len;i++){
if (cha[i] >= 'A' and cha[i] <= 'Z'){
cout<<char((cha[i] + n - 65)%26 + 65);
} else if (cha[i] >= 'a' && cha[i] <= 'z'){
cout<<char((cha[i] + n - 97)%26 + 97);
}
else cout<<cha[i];
}
return 0;
}
不懂在下面提问,我会进行解答,当然问老师也是可以的
全部评论 3
剩下一到王老师来
2023-08-09 来自 上海
1好好好
2023-08-09 来自 浙江
1
捧场
2023-08-09 来自 浙江
1捧场
2023-08-09 来自 浙江
0
捧场
2023-08-08 来自 浙江
1顶
2023-08-09 来自 浙江
2
有帮助,赞一个