【题目链接】
【题目考点】
1. ASCII码
2. 字符串
【解题思路】
分析规律可知,明文字母是密文字符向前数的第5个字母。
解法1:字母对应数字
把字母c转为对应的数字,A对应数字0,B对应数字1… Z对应数字25,方法为c - 'A'
- 如果
c - 'A' >= 5
,那么明文字母对应的数字为为c - 'A' - 5
- 如果
c - 'A' < 5
,那么明文字母对应的数字为c - 'A' + 26 - 5
最后,再将数字转为字符
最终整合为c = (c - 'A' + 26 - 5) % 26 + 'A'
解法2:直接判断当前字母的ASCII码
如果当前密文字母变量c是’E’及’E’之前的字母,那么对应的明文字母为c+21
如果当前密文字母变量c是’F’及’F‘之后的字母,那么对应的明文字母为c-5
【题解代码】
解法1:字符数组 字母对应数字
#include<bits/stdc++.h>
using namespace std;
int main()
{
char s[205];
cin.getline(s, 205);
int len = strlen(s);
for(int i = 0; i < len; ++i)
{
if(s[i] >= 'A' && s[i] <= 'Z')
s[i] = (s[i] - 'A' + 26 - 5) % 26 + 'A';
}
cout << s;
return 0;
}
解法2:string类 判断字符的ASCII码
#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] <= 'E')
s[i] = s[i] + 21;
else if(s[i] >= 'F' && s[i] <= 'Z')
s[i] = s[i] - 5;
}
cout << s;
return 0;
}
解法3:不断读入字符,判断输出
#include<bits/stdc++.h>
using namespace std;
int main()
{
char c;
c = getchar();
while(c != '\n')
{
if (c >= 'A' && c <= 'Z')
putchar((c - 'A' - 5 + 26) % 26 + 'A');
else
putchar(c);
c = getchar();
}
return 0;
}