说明:
高精度乘法比高精度加法难上一点,但是来看高精度乘法和除法了,那么想必高精度加法和减法都有了解过,所以开始的数组逆序存入什么的不说了(
来回顾一下高精度:
由于计算机的存储字节有限,所以不能完整表示一个很大整数的精确值,这时候就得用到其他的方法,称之为高精度算法。这里的高精度乘法主要指按位模拟乘法,实际上就是模拟乘法的过程,也就是笔算的过程。高精度运算,是指参与运算的数(加数,减数,因子……)范围大大超出了标准数据类型(整型,实型)能表示的范围的运算。例如,求两个20000位的数的和。这时,就要用到高精度算法了。
高精度乘法流程:
- 读取两个大数A和B,并计算它们的长度la和lb。
- 初始化三个数组a、b和c,分别用于存储大数A、B和它们的乘积。
- 将大数A和B逆序存储在数组a和b中,方便计算乘积。
- 调用mul函数计算乘积,将结果存储在数组c中。
- 输出数组c中的结果。
(借用董晓老师的示意图)
代码如下:
#include <bits/stdc++.h>
using namespace std;
const int N=4001;
int a[N],b[N],c[N];
int la,lb,lc;
void mul(int a[],int b[],int c[]){ //a*b=c
for(int i=1;i<=la;i++)
for(int j=1;j<=lb;j++)
c[i+j-1]+=a[i]*b[j]; //存乘积
for(int i=1;i<lc;i++){
c[i+1]+=c[i]/10; //存进位
c[i]%=10; //存余数
}
while(c[lc]==0&&lc>1) lc--; //去0
}
int main(){
char A[N],B[N];
cin>>A>>B;
la=strlen(A); lb=strlen(B); lc=la+lb;
for(int i=1;i<=la;i++)a[i]=A[la-i]-'0';
for(int i=1;i<=lb;i++)b[i]=B[lb-i]-'0';
mul(a,b,c);
for(int i=lc;i>=1;i--) cout<<c[i];
return 0;
}
高精度除法:
说明:
高精度除法是指能够处理超出标准数据类型(如int、long等)表示范围的大数除法运算的算法。由于计算机中的标准数据类型对数值的大小有限制,当除数或被除数的数值超过了这些限制时,就需要使用高精度除法算法来计算。
高精度除法的基本思想是将大数表示为多个数字的组合,通常是一个数组,数组的每个元素存储大数的一位。然后,模拟手算的长除法过程,逐位进行除法运算,计算商和余数。
主要步骤:
- 读取一个大数
A
和一个整数b
,并计算大数A
的长度len
。 - 初始化两个数组
a
和c
,分别用于存储大数A
和除法结果。 - 将大数
A
逆序存储在数组a
中,方便计算除法。 - 调用
div
函数计算除法结果,将结果存储在数组c
中。 - 输出数组
c
中的结果。
特别注意:是从高位向低位存入
高精/低精代码:
#include <bits/stdc++.h>
using namespace std;
const int N=5005;
int a[N],b,c[N];
int len;
void div(int a[],int b,int c[]){ //a/b=c
long long t=0;
for(int i=len;i>=1;i--){
t=t*10+a[i]; //被除数
c[i]=t/b; //存商
t%=b; //余数
}
while(c[len]==0&&len>1) len--; //去0
}
int main(){
char A[N]; cin>>A>>b; len=strlen(A);
for(int i=1;i<=len;i++) a[i]=A[len-i]-'0';
div(a,b,c);
for(int i=len;i;i--) cout<<c[i];
return 0;
}
高精/高精代码:
#include<bits/stdc++.h>
using namespace std;
#define N 310
string a,b;
int as[310],bs[310],ans[310],lena,lenb;
void jf(){
for(int i=0;i<lena;i++)as[i]-=bs[i];
for(int i=0;i<lena;i++)
{
if(as[i]<0){
as[i]+=10;
as[i+1]--;
}
}
while(as[lena-1]==0&&lena>0)lena--;
}
bool dx(){
if(lena>lenb)return true;
if(lena<lenb)return false;
for(int i=lena-1;i>=0;i--){
if(as[i]>bs[i])return true;
if(as[i]<bs[i])return false;
}
return true;
}
void jy(int k)
{
if(k==0)k=1;
if(k!=1)
{
for(int i=lenb-1;i>=0;i--)
{
bs[i+k-1]=bs[i];
bs[i]=0;
}
lenb+=k-1;
}
while(dx()==true){
jf();
ans[k-1]++;
int ls=k-1;
for(int i=k-1;i<=ls;i++)
{
if(ans[i]>9){
ans[i+1]++;
ans[i]-=10;
if(ans[i+1]>9)ls++;
}
}
}
if(k!=1)
{
for(int i=k-1;i<lenb;i++)
{
bs[i-k+1]=bs[i];
bs[i]=0;
}
lenb-=k-1;
}
}
int main(){
cin>>a>>b;
if(a==b){cout<<1<<endl<<0<<endl;return 0;}
lena=a.size();
lenb=b.size();
for(int i=0;i<lena;i++)as[i]=a[lena-i-1]-'0';
for(int i=0;i<lenb;i++)bs[i]=b[lenb-i-1]-'0';
memset(ans,0,sizeof(ans));
int k=lena-lenb;
if(k<0){cout<<0<<endl<<a<<endl;return 0;}
while(k>=0){
if(k==0&&dx()==false)break;
jy(k);
k=lena-lenb;
}
int h1=301,h2=301;
while(ans[h1]==0&&h1>0)h1--;
while(as[h2]==0&&h2>0)h2--;
for(int i=h1;i>=0;i--)
cout<<ans[i];
cout<<endl;
for(int i=h2;i>=0;i--)
cout<<as[i];
cout<<endl;
}