高精度乘法详解
·
高精度乘法详解
与加减不同的地方,乘除法是 用一个数的某一位乘或除另一个数的所有位。
推荐先学完高精度加法和减法。
高精度减法详解
高精度加法详解
存储方法和最高位去零方法差不多。
这里具体讲解实现乘法竖式方法的方法。
首先一个乘数的一位乘以另一个乘数的全部位数,可以用二重循环实现。
发现C数组的下标是A,B数组下标之和。
明白以上两点,离写出代码也不远了。
接下来直接看代码吧。
代码实现:
#include <iostream>
#include <cstring>
using namespace std;
#define max 1000000
char a[max],b[max];
int A[max],B[max],C[2*max],temp,lena,lenb,lenc;
bool flag1=true,flag2=true;
int main(){
cin>>a;
cin>>b;
lena=strlen(a);
lenb=strlen(b);
lenc=lena+lenb;
if(a[0]=='-')
{
strcpy(a,&a[1]);
flag1=false ;
}
if(b[0]=='-')
{
strcpy(b,&b[1]);
flag2=false ;
}
if(flag1==true&&flag2==false||flag1==false&&flag2==true)
cout<<"-";
for(int i=0;i<lena;++i)
A[i]=a[lena-1-i]-'0';
for(int i=0;i<lenb;++i)
B[i]=b[lenb-1-i]-'0';
for(int i=0;i<lena;++i)
{
temp=0;
for(int j=0;j<lenb;++j)
{
C[i+j]=A[i]*B[j]+temp+C[i+j];
temp=C[i+j]/10;
C[i+j]%=10;
}
C[i+lenb]=temp;
}
for(int i=lenc-1;i>=0;--i)
{
if(C[i]==0&&lenc>1)
{
lenc--;
}
else {
break;
}
}
for (int i=lenc-1; i>=0; i--)
{
cout<<C[i];
}
return 0;
}
例题练习:
https://www.luogu.com.cn/problem/P1303
题目描述
求两数的积。
输入格式
两行,两个整数。
输出格式
一行一个整数表示乘积。
输入输出样例
输入 #1
1
2
输出 #1
2
说明/提示
每个数字不超过 10200010^{2000}102000 ,需用高精。
阅读全文
AI总结
更多推荐
目录
所有评论(0)