今天,我们开始学习高精度加法。
高精度加法涉及两个加数和一个和,所以,我们需要两个字符串与三个整型数组。
准备
在基础篇我们知道:高精度数在C++中没有定义,我们需要自己编写程序来计算,而最好的方法就是模拟竖式计算!
而在这里,我们必须知道:数字的长度就是字符串的长度!
所以,我们可以得高精度加法的原理,如下所示:
由此,我们推出高精度加法的核心代码
int c[100]={1};
void add(int a[],int b[])
{
int x=0;//x是进位
while(c[0]<=a[0]||c[0]<=b[0])
{
c[c[0]]=a[c[0]]+b[c[0]]+x;//第i位相加并加上进位
x=c[c[0]]/10;//保存进位
c[c[0]]%=10;//第i位的值
c[0]++;
}
}
注意:和可能会有前导零,处理它的方法很简单:
while(c[i]==0&&i>1) i--;
实现
代码非常简单,极易实现。
下面给出完整代码:
#include<cstdio>
#include<cstring>
int a[100],b[100],c[100],lena,lenb,lenc;
char s[100];
void Scan(int a[],int &len)
{
memset(s,0,sizeof(s));
gets(s);
len=strlen(s);
for(int i=0;i<len;i++) a[len-i]=s[i]-'0';
}
void Print()
{
for(int i=lenc;i>0;i--) printf("%d",c[i]);
}
void add()
{
int x=0;
while(lenc<=lena||lenc<=lenb)
{
c[lenc]=a[lenc]+b[lenc]+x;
x=c[lenc]/10;
c[lenc]%=10;
lenc++;
}
lenc++;
while(c[lenc]==0&&lenc>1) lenc--;
}
int main()
{
Scan(a,lena);
Scan(b,lenb);
add();
Print();
return 0;
}
现在,你已经学会了高精度加法,下一节我们将学习高精度减法。
补博客计划:重载运算符相关文章:
1. 【重载运算符】高精度计算——(三)减法
2. 【重载运算符】高精度计算——(四)高精乘低精
3. 【重载运算符】高精度计算——(五)高精乘高精
4. 【重载运算符】高精度计算——(六)高精除以低精
5. 【重载运算符】高精度计算——(七)高精除以高精
6. 【重载运算符】高精度计算——(八)超级结构体—BigInt
7. 【重载运算符】比较运算符——(九)STL下结构体内的重载