A*B Problem(高精度)
我们要做高精度的a*b,就要知道怎么用数学计算
我们可以模拟竖式的运算
for(int i = 1; i <= al;i++)
{
for(int j = 1; j <= bl;j++)
{
ans[i+j-1] += a[i] * b[j];
ans[i+j] += ans[i+j-1] / 10;
ans[i+j-1] %= 10;
}
}
这个是这代码的关键部分,也是一个模板
如 13*14
那么双重循环先是13*4, 有循环一次就是13*10.
完整代码
#include <bits/stdc++.h>
using namespace std;
string a1, b1;
int a[2005], b[2005], ans[4025], al, bl, an1;
void tim()
{
reverse(a + 1, a + 1 + al);
reverse(b + 1, b + 1 + bl);
an1 = al + bl;
for(int i = 1; i <= al;i++)
{
for(int j = 1; j <= bl;j++)
{
ans[i+j-1] += a[i] * b[j];
ans[i+j] += ans[i+j-1] / 10;
ans[i+j-1] %= 10;
}
}
while(!ans[an1])
an1--;
reverse(ans + 1, ans + 1 + an1);
return ;
}
int main()
{
cin >> a1 >> b1;
if(a1 == "0" || b1 == "0")
{
cout << 0;
return 0;
}
al = a1.size();
bl = b1.size();
for(int i = 1; i <= al; i++)
a[i] = a1[i-1] - '0';
for(int i = 1; i <= bl; i++)
b[i] = b1[i-1] - '0';
tim();
for(int i = 1; i <= an1; i++)
cout << ans[i];
return 0;
}
浙公网安备 33010602011771号