高精度加法、乘法
1. 高精度加法
-
处理:数据的接收和存储、进位问题
-
要领:模拟加法运算式(如下图)

#include<bits/stdc++.h>
using namespace std;
int a[1010],b[1010],c[1010]; //分别存加数、被加数、结果
int main()
{
char sa[1010],sb[1010];//用字符串输入
cin>>sa>>sb;
int la=strlen(sa),lb=strlen(sb);
for(int i=1;i<=la;i++){
a[i]=sa[la-i]-'0'; //字符串逆序转成整型 由高到低位——>由低到高位
}
for(int i=1;i<=lb;i++){
b[i]=sb[lb-i]-'0';
}
int lc=max(la,lb)+1; //加一位避免遗漏最高位的进位
int m=0; //进位 加法的进位只能是0和1
for(int i=1;i<=lc;i++){
c[i]=a[i]+b[i]+m;
if((c[i])>9){
c[i]=c[i]-10;
m=1; //进位
}
else{
m=0; //不进位
}
}
for(int i=lc;i>=1;i--){ //由高到低位输出
if(c[i]==0 && i==lc) continue;
cout<<c[i];
}
return 0;
}
2. 高精度乘法
-
模拟竖式乘法运算式
-
用一个数的每一位a[i](从低位开始)逐位与另一个数的每一位b[j]相乘

#include<bits/stdc++.h>
using namespace std;
int a[110],b[110],c[210];
int main()
{
char sa[110],sb[110];
cin>>sa>>sb;
int la=strlen(sa),lb=strlen(sb);
for(int i=1;i<=la;i++){
a[i]=sa[la-i]-'0';
}
for(int i=1;i<=lb;i++){
b[i]=sb[lb-i]-'0';
} //以上为字符到整型的转换
int k,w,x,y;
for(int i=1;i<=la;i++){
for(int j=1;j<=lb;j++){ //a[i]的每一个数依次与b[j]的每个数相乘
w=a[i]*b[j];
x=w%10; //当前位
y=w/10; //进位
k=i+j-1; //所在位数
c[k]=c[k]+x;
c[k+1]=c[k+1]+y+c[k]/10;
c[k]=c[k]%10;
}
}
int lc=la+lb;
while(c[lc]==0){ //找到最高的非0位
lc--;
if(lc<0) { //特殊情况:只有一位0
cout<<0;
return 0;
}
}
for(int i=lc;i>=1;i--){
cout<<c[i];
}
return 0;
}

浙公网安备 33010602011771号