前言
上一篇博客我们做了A+B的高精度,这次我们做的是高精度乘以高精度,不过不要担心在实际的题目当中,我们大部分用到的只会是高精度乘以低精度。这样的高精度乘以高精度很少,当然也不是没有 而实际上,这种高精度是加减乘除中最简单的。
题目概述
AC代码
#include<iostream>
#include<vector>
#include<string>
using namespace std;
string a,b;
#define maxn 10001
int A[maxn],B[maxn],C[maxn];
int main()
{
cin>>a>>b;
for(int i=a.size()-1,j=1;i>=0;--i,++j)
A[j]=a[i]-48;
for(int i=b.size()-1,j=1;i>=0;--i,++j)
B[j]=b[i]-48;
for(int i=1;i<=a.size();++i)
for(int j=1;j<=b.size();++j)
C[i+j-1]+=A[i]*B[j];
int len=a.size()+b.size();
for(int i=1;i<=len;++i)
{
C[i+1]+=C[i]/10;
C[i]%=10;
}
for(;!C[len];--len);
len=max(1,len);
for(int i=len;i>=1;--i)
cout<<C[i];
return 0;
}
分析思路
1. 同高精度加法一般的,我们模拟人工的竖式乘法, 不过不同的是我们在这里是把每个位置都直接相乘。比如 198 ∗ 23 198*23 198∗23,我们是直接用 8 ∗ 2 8 *2 8∗2,再 8 ∗ 3 8*3 8∗3,也就是说我们是控制竖乘的上面的每个数字一口气分别乘下面的所有数字。
2. 同时,这样的乘法还具有一个非常重要的性质,记i为上面数字从个位开始数的第i位,j为下面数字从各位开始数的第j位,C为结果的容器/数组,那么有:1
c
i
+
j
−
1
=
a
i
∗
b
j
c_{i+j-1}=a_i*b_j
ci+j−1=ai∗bj
3.同时与加法不同,==*我们统一计算完每个位置数字后统一进位,*==这样不容易出错。而实际上,加法完全也是可以这样做的。
4.输出细节同高精度加法,倒着输出。
文末广告
学习算法和数据结构真的是个很累的过程,不会做只能求助于题解。 因为写代码这个东西基本上是千人千面。同时网络上搜到的题解很多要么用到的是自己还没学到的知识,看不懂;要么内核过于简陋,只能糊弄当前题目,不具有普适性。
如果你是一个喜欢做洛谷,ACwing和PTA的题目的同学,欢迎关注我的博客,我主要在这三个平台上做题,认为有价值和有难度的题目我会写题解发布出来。
TreeTraverler的往期文章
该公式来自《洛谷深入浅出程序设计竞赛》,严格的证明这里略去。 ↩︎