高精度乘法-C++模板-实现-详细
乘法
貌似高精度乘法看起来很简单。。。
co模板 快捷路径
#include<cstdio> using namespace std; const int wei=100000; int a[100][wei],bz[100],ad[100]; void read(int i) { char ch=getchar(); bz[i]=1,ad[i]=0; int b[wei]; while (ch<'0' || ch>'9') { if (ch=='-') bz[i]=-1; ch=getchar(); } while (ch>='0' && ch<='9') { b[++ad[i]]=ch-'0';ch=getchar();} for (int j=1;j<=ad[i];++j) a[i][ad[i]-j+1]=b[j]; } void mul(int i,int j,int k) { for (int l=1;l<=ad[i];++l) { for (int r=1;r<=ad[j];++r) { a[k][l+r-1]+=a[i][l]*a[j][r]; a[k][l+r]+=a[k][l+r-1]/10; a[k][l+r-1]%=10; } } ad[k]=ad[i]*ad[j]+3; while (a[k][ad[k]]==0) --ad[k]; bz[k]=bz[i]*bz[j]; return; } int main() { read(1); read(2); mul(1,2,3); if (bz[3]==-1) printf("-"); for (int i=ad[3];i>0;--i) printf("%d",a[3][i]); }
乘法主要采用模拟手动运算解决,枚举每一次相乘即可
注意一下乘之后的位数会不会爆就行了
下面代码中附有具体操作:
#include<cstdio>
using namespace std;
const int wei=100000; //数的位数,初始为10100000。
int a[100][wei],bz[100],ad[100]; //a为具体数字,bz为正负号,ad为位数
void read(int i) //读入高精度数
{
char ch=getchar();
bz[i]=1,ad[i]=0;
int b[wei];
while (ch<'0' || ch>'9') { if (ch=='-') bz[i]=-1; ch=getchar(); }
while (ch>='0' && ch<='9') { b[++ad[i]]=ch-'0';ch=getchar();}
for (int j=1;j<=ad[i];++j) a[i][ad[i]-j+1]=b[j];
}
void mul(int i,int j,int k) //乘法,意为将编号i的数乘以编号j的数
{
for (int l=1;l<=ad[i];++l) //枚举i的每一位
{
for (int r=1;r<=ad[j];++r) //枚举j
{
a[k][l+r-1]+=a[i][l]*a[j][r]; //即结果的(L+R-1)位要加上乘积(列个竖式看看就知道为什么了)
a[k][l+r]+=a[k][l+r-1]/10; //进位操作
a[k][l+r-1]%=10;
}
}
ad[k]=ad[i]*ad[j]+3; //押位操作
while (a[k][ad[k]]==0) --ad[k]; //精确一下位数
bz[k]=bz[i]*bz[j]; //符号为两个数符号相乘
return;
}
int main()
{ //测试
read(1); //读入编号一的数
read(2); //读入编号二的数
mul(1,2,3); //相乘
if (bz[3]==-1) printf("-"); //判断正负
for (int i=ad[3];i>0;--i) //输出
printf("%d",a[3][i]);
}
乘法部分就这样结束了,有意见欢迎在评论区提出。

浙公网安备 33010602011771号