小Z老师最近在玩一个有意思的游戏,他手上有两个很大的数 a 和 b。对于 a,他会把它翻转过来得到一个数 a′,然后把 a′ 拼接在 a 的后面得到一个新的数 A,例如对于 123 这个数来说,翻转过来是 321,拼起来之后就是 123321;对于 100 这个数,翻转过来是 001,拼起来之后就是 100001。对于 b,他也会进行同样的操作,得到新的数 B。然后,他会求出 A×B 的结果,请你帮他完成这个过程。 数据范围 记 n 为 a 的位数,m 为 b 的位数。 对于 100% 的数据,保证 1≤n,m≤100,a≠0,b≠0 c++代码
时间: 2024-03-07 22:47:35 浏览: 186
好的,以下是 C++ 代码实现:
```cpp
#include <iostream>
#include <string>
using namespace std;
int main() {
string a, b;
cin >> a >> b;
// 翻转并拼接 a 和 b
string a_reverse(a.rbegin(), a.rend());
string b_reverse(b.rbegin(), b.rend());
string A = a + a_reverse;
string B = b + b_reverse;
// 计算 A * B
int len_a = A.size(), len_b = B.size();
int len_c = len_a + len_b;
string c(len_c, '0');
for (int i = 0; i < len_a; i++) {
int carry = 0;
for (int j = 0; j < len_b; j++) {
int temp = (A[i] - '0') * (B[j] - '0') + carry + (c[i + j] - '0');
c[i + j] = temp % 10 + '0';
carry = temp / 10;
}
if (carry) c[i + len_b] += carry;
}
// 去除前导零
int i = len_c - 1;
while (i > 0 && c[i] == '0') i--;
c.resize(i + 1);
// 输出结果
cout << c << endl;
return 0;
}
```
其中,第 9 行和第 10 行分别使用 `string` 的构造函数将 `a` 和 `b` 翻转并拼接起来。第 14 行到第 30 行实现了两个字符串的乘法。第 33 行到第 35 行去除了乘积的前导零。最后输出结果即可。
阅读全文