洛谷B2113,B2114,B2116
B2113
题目:
模拟,给定一个字符串,求出相邻两个字符相加得到的新字符
收获:
字符串字符运算 ,若不进行强制转换,则会直接输出字符之间ascll码相加减等运算 ,即得到的结果是ascll的加减法的结果
当你执行 cout << (s[i] + s[i+1])时; 如果 s[i] 是 '1',s[i+1] 是 '2',那么实际上输出的是 ASCII 码 49 + 50,即 99.
#include<bits/stdc++.h>
using namespace std;
int main(){
string s;
getline(cin,s);
for(int i=0;i<s.length();i++){
if(i!=s.length()-1){
cout<<(char)(s[i]+s[i+1]);
continue;
}
cout<<char(s[i]+s[0]);
}
return 0;
}//输入1234,输出cege
//而不进行强制转换
#include<bits/stdc++.h>
using namespace std;
int main(){
string s;
getline(cin,s);
for(int i=0;i<s.length();i++){
if(i!=s.length()-1){
cout<<(s[i]+s[i+1]);
continue;
}
cout<<(s[i]+s[0]);
}
return 0;
}//输入1234,输出99101103101,99就是c的ascll码,其它亦是如此
B2114
题目:
模拟,求出AGCT所匹配的字符
收获:
cout字符串的名字就能打印字符串,无需遍历字符串进行打印,cout<<s
易错:
不能用if,表选择关系要用else if,否则会执行多次
#include<bits/stdc++.h>
using namespace std;
int main(){
string s;
getline(cin,s);
for(int i=0;i<s.length();i++){
if(s[i]=='A'){
s[i]='T';
}
else if(s[i]=='T'){
s[i]='A';
}
else if(s[i]=='G'){
s[i]='C';
}
else if(s[i]=='C'){
s[i]='G';
}
}
cout<<s;
return 0;
}
B2116
题目:
给出一个字符串,求出1.字符的大小写互换,2.字符逆序输出,3.字符循环平移
收获:
STL常用函数:s.length()表示字符串长度/isupper(s[i]) or islower(s[i])判断是大写还是小写
tolower(s[i]) or toupper(s[i])将字符串中字母强制转为小写或大写/reverse(s.begin(),s.end()),右边区间为开区间
易错:
原文与密码顺序弄反了
#include<bits/stdc++.h>
using namespace std;
int main(){
string s;
cin>>s;
int l=s.length();//l表示字符串长度
for(int i=0;i<l;i++){
if(isupper(s[i]))s[i]=tolower(s[i]);
else if(islower(s[i]))s[i]=toupper(s[i]);
}
reverse(s.begin(),s.end());//将字符串翻转
for(int i=0;i<l;i++){
switch(s[i]){
case 'x':cout<<'a';break;
case 'y':cout<<'b';break;
case 'z':cout<<'c';break;
case 'X':cout<<'A';break;
case 'Y':cout<<'B';break;
case 'Z':cout<<'C';break;
default:cout<<char(s[i]+3);break;
}//采用特判进行循环右移
}
return 0;
}
//摘抄
//若不用特判来表示循环右移
char Shift(char c){
if(c>='A'&&c<='Z')return ((c-'A'+3)+26)%26+'A';
else return ((c-'a'+3)+26)%26+'a';
}//何为循环右移,a~z字母轮完再回到a,大写亦如此 ,最基本的写法√√√要求掌握