字符串的反码(吉林大学考研复试题)

题面

一个二进制数,将其每一位取反,称之为这个数的反码。下面我们定义一个字符的反码。如果这是一个小写字符,则它和字符’a’的距离与它的反码和字符’z’的距离相同;如果是一个大写字符,则它和字符’A’的距离与它的反码和字符’Z’的距离相同;如果不是上面两种情况,它的反码就是它自身。 举几个例子,'a’的反码是’z’;‘c’的反码是’x’;‘W’的反码是’D’;‘1’的反码还是’1’;’%‘的反码还是’%’。 一个字符串的反码定义为其所有字符的反码。我们的任务就是计算出给定字符串的反码。
(’%‘的反码还是’%'处原题面为美元符号,但是这里打不出来,就做一个样例说明符号字符的反码还是它自己)

输入描述:
输入每行都是一个字符串,字符串长度不超过 80 个字符。如果输入只有!,表示输入结束,不需要处理。

输出描述:
对于输入的每个字符串,输出其反码,每个数据占一行。

示例1
输入
Hello
JLU-CCST-2011
!
输出
Svool
QOF-XXHG-2011

注意的地方

输入只有"!"的意思是你这一行输入的字符只有!而不只是只输入一个!
这个题用string做就可以,不用管他的长度限制

思路与测试代码

1.算距离可以直接用类似s[i]-'a’的表示,这个减法得到的是两个char之间ASCII码的差值,也就是距离
2.要解决输入只有!,可以先设置一个bool变量end为true,再对该字符串是否全是由!组成,如果发现有不同于!的字符。那么把end设置为false即可。接下来再判断end,如果是true则结束
代码如下(已通过牛客网OJ判定)

#include<iostream>
#include<string>
using namespace std;
string letters = "abcdefghijklmnopqrstuvwxyz";//小写字母集
string letters1 = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";//大写字母集
int main() {

	while (true) {
		string s; bool end = true;
		cin >> s; 
		for (int i = 0; i < s.size(); ++i) {
			if (s[i] != '!') end = false;
		}
		if (end)break;//该字符串全是!跳出循环


		for (int i = 0; i < s.size(); ++i) {
			if (islower(s[i])) {
				int distance = s[i] - 'a';
				for (int i1 = 0; i1 < 26; ++i1) {
					if (distance == 'z' - letters[i1])
					{
						s[i] = letters[i1];
					}
				}
			}

			if (isupper(s[i])) {
				int distance1 = s[i] - 'A';
				for (int i2 = 0; i2 < 26; ++i2) {
					if (distance1 == 'Z' - letters1[i2])
					{
						s[i] = letters1[i2];
					}
				}
			}

			cout << s[i];
		}
		cout << endl;//换行
	}
	return 0;
}
发布了3 篇原创文章 · 获赞 3 · 访问量 120

猜你喜欢

转载自blog.csdn.net/qq_43853021/article/details/104954557