PAT 乙级 1048
题目
题目地址:PAT 乙级 1048
思路
这道题坑的地方在于:即使B的长度小于A,仍然要对B补齐,也就是说最终结果的长度取决于A和B中长度更长的那一项;即只要A、B长度不一致,就要对短的一个进行补齐操作
在补齐过程中解决了之前一直忽略的一个问题——对于string类型的字符串按字符逐个进行赋值,这个过程中就出现了问题:
先来看一段代码
1 #include <iostream> 2 #include <string> 3 using namespace std; 4 5 int main() { 6 string str; 7 for (int i = 0; i < 10; i++) 8 str[i] = '0'; 9 cout << str.size() << endl; 10 cout << str << endl; 11 12 return 0; 13 }
那么这段代码的结果会是怎样的?我们来验证一下
0
显然并不是预想的结果,原因就在于string不能像char一样实现a[ i ] = b[ j ]这样的操作;
对于string类型的字符串实现逐个字符赋值,需要使用 “+=” 这个算符实现,代码如下:
1 #include <iostream> 2 #include <string> 3 using namespace std; 4 5 int main() { 6 string str; 7 for (int i = 0; i < 10; i++) 8 str += '0'; //赋值时一定注意格式是str,而不是str[i] 9 cout << str.size() << endl; 10 cout << str << endl; 11 12 return 0; 13 }
结果如下:
10 0000000000
显然,这个结果才是我们希望看到的;
代码
1 #include <iostream> 2 #include <string> 3 using namespace std; 4 5 int main() { 6 string a, b; 7 string zero; 8 for (int i = 0; i < 100; i++) 9 zero += '0'; 10 string result; 11 cin >> a >> b; 12 int len_a = a.size(); 13 int len_b = b.size(); 14 if (len_a > len_b) { 15 string tmp = b; 16 string tmp1; 17 int len = len_a - len_b; 18 tmp1 = zero.substr(0, len); 19 b = tmp1 + tmp; 20 } 21 else if (len_a < len_b) { 22 string tmp = a; 23 string tmp1; 24 int len = len_b - len_a; 25 tmp1 = zero.substr(0, len); 26 a = tmp1 + tmp; 27 } 28 bool flag = true; 29 for (int i = a.size() - 1; i >= 0; i--) { 30 if (flag) { 31 int tmp = ((int(b[i]) - 48) + (int(a[i]) - 48)) % 13; 32 if (tmp == 10) 33 result.push_back('J'); 34 else if (tmp == 11) 35 result.push_back('Q'); 36 else if (tmp == 12) 37 result.push_back('K'); 38 else 39 result.push_back(char(tmp + 48)); 40 flag = false; 41 } 42 else { 43 int tmp = ((int(b[i]) - 48) - (int(a[i]) - 48)); 44 if (tmp < 0) 45 tmp += 10; 46 result.push_back(char(tmp + 48)); 47 flag = true; 48 } 49 } 50 for (int i = result.size() - 1; i >= 0; i--) 51 cout << result[i]; 52 cout << endl; 53 54 return 0; 55 }