题目
题目地址:PAT 乙级 1048
思路
这道题坑的地方在于:即使B的长度小于A,仍然要对B补齐,也就是说最终结果的长度取决于A和B中长度更长的那一项;即只要A、B长度不一致,就要对短的一个进行补齐操作
在补齐过程中解决了之前一直忽略的一个问题——对于string类型的字符串按字符逐个进行赋值,这个过程中就出现了问题:
先来看一段代码
#include <iostream>
#include <string>
using namespace std; int main() {
string str;
for (int i = ; i < ; i++)
str[i] = '';
cout << str.size() << endl;
cout << str << endl; return ;
}
那么这段代码的结果会是怎样的?我们来验证一下
0
显然并不是预想的结果,原因就在于string不能像char一样实现a[ i ] = b[ j ]这样的操作;
对于string类型的字符串实现逐个字符赋值,需要使用 “+=” 这个算符实现,代码如下:
#include <iostream>
#include <string>
using namespace std; int main() {
string str;
for (int i = ; i < ; i++)
str += ''; //赋值时一定注意格式是str,而不是str[i]
cout << str.size() << endl;
cout << str << endl; return ;
}
结果如下:
显然,这个结果才是我们希望看到的;
代码
#include <iostream>
#include <string>
using namespace std; int main() {
string a, b;
string zero;
for (int i = ; i < ; i++)
zero += '';
string result;
cin >> a >> b;
int len_a = a.size();
int len_b = b.size();
if (len_a > len_b) {
string tmp = b;
string tmp1;
int len = len_a - len_b;
tmp1 = zero.substr(, len);
b = tmp1 + tmp;
}
else if (len_a < len_b) {
string tmp = a;
string tmp1;
int len = len_b - len_a;
tmp1 = zero.substr(, len);
a = tmp1 + tmp;
}
bool flag = true;
for (int i = a.size() - ; i >= ; i--) {
if (flag) {
int tmp = ((int(b[i]) - ) + (int(a[i]) - )) % ;
if (tmp == )
result.push_back('J');
else if (tmp == )
result.push_back('Q');
else if (tmp == )
result.push_back('K');
else
result.push_back(char(tmp + ));
flag = false;
}
else {
int tmp = ((int(b[i]) - ) - (int(a[i]) - ));
if (tmp < )
tmp += ;
result.push_back(char(tmp + ));
flag = true;
}
}
for (int i = result.size() - ; i >= ; i--)
cout << result[i];
cout << endl; return ;
}