小Z老师最近在玩一个有意思的游戏,他手上有两个很大的数 a 和 b。对于 a,他会把它翻转过来得到一个数 a′,然后把 a′ 拼接在 a 的后面得到一个新的数 A,例如对于 123 这个数来说,翻转过来是 321,拼起来之后就是 123321;对于 100 这个数,翻转过来是 001,拼起来之后就是 100001。对于 b,他也会进行同样的操作,得到新的数 B。然后,他会求出 A×B 的结果,请你帮他完成这个过程。 输入格式 共两行。 第一行,一个很大的正整数 a。 第二行,一个很大的正整数 b。 输出格式 仅一行,一个正整数,表示最后的结果。 样例输入 12 676 样例输出 826221396 数据范围 记 n 为 a 的位数,m 为 b 的位数。 对于 100% 的数据,保证 1≤n,m≤100,a≠0,b≠0。c++代码
时间: 2024-03-12 18:43:01 浏览: 267
好的,下面是C++代码实现:
```cpp
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 205;
int a[N], b[N], c[N * 2];
void reverse(int a[], int n)
{
for (int i = 0, j = n - 1; i < j; i ++, j -- )
swap(a[i], a[j]);
}
int main()
{
string sa, sb;
cin >> sa >> sb;
int n = sa.size(), m = sb.size();
// 将字符串转换成整数数组,同时翻转
for (int i = 0; i < n; i ++ ) a[i] = sa[n - i - 1] - '0';
for (int i = 0; i < m; i ++ ) b[i] = sb[m - i - 1] - '0';
// 计算乘积
for (int i = 0; i < n; i ++ )
for (int j = 0; j < m; j ++ )
c[i + j] += a[i] * b[j];
// 处理进位
int k = n + m - 1;
while (c[k] == 0 && k > 0) k -- ;
for (int i = 0; i < k; i ++ )
{
c[i + 1] += c[i] / 10;
c[i] %= 10;
}
while (c[k] > 10)
{
c[k + 1] += c[k] / 10;
c[k] %= 10;
k ++ ;
}
// 翻转得到最终结果
reverse(c, k + 1);
for (int i = 0; i <= k; i ++ ) cout << c[i];
cout << endl;
return 0;
}
```
时间复杂度:$O(nm)$,其中 $n$ 和 $m$ 分别为两个数的位数。
阅读全文