1. 主页
  2. 文档
  3. Level3题解(1-10)
  4. 第1课 高精度计算
  5. 高精度加法

高精度加法

首先观察我们在竖式加法时的做法
str1=“3216”
str2=“999765”

     3216
 + 999765
---------
  1002981
  • 对位(将str1的各位6和str2的各位5对齐,倒序存储就是为了对位和计算的方便)
  • 从最低位开始依次相加,相加的时候要处理进位
    主程序分为三个模块来处理
  • 读数
  • 加法处理
  • 输出
int main(){
	int a[N],b[N];
	memset(a,0,sizeof(a)); //对a数组进行清零处理,在库<cstring>中
	memset(b,0,sizeof(b));
	Read(a); //读入第一个加数存到a数组中
	Read(b); //读入第一个加数存到b数组中
	Add(a,b); //将a和b加起来,将和存到a数组中
	Out(a); //将和a输出
	return 0;
}

然后分模块去进行分别处理

void Read(int a[]){ //读数模块
	string s;
	cin>>s; //用字符串读入该数
	a[0]=s.size(); //存储该数的长度,也可用a[0]=s.length();
	for(int i=1;i<=a[0];i++)
	  a[i]=s[a[0]-i]-'0'; //i和a[0]-i实现下标的倒序,-‘0’实现字符和整数的转换,注意字符串的下标是从0到a[0]-1,整数数组下标是从a[0]到1
	return ;
}
void Add(int a[],int b[]){//相加模块
	if(a[0]<b[0])a[0]=b[0]; //和存储在a数组中,a[0]要保证能加到两个数的最高位
	for(int i=1;i<=a[0];i++){
		a[i]+=b[i]; //存储和
		a[i+1]+=a[i]/10; //处理进位,将进位加到上一位去
		a[i]%=10; //去掉进位后的数值。处理进位也可以改成if(a[i]>9) a[i+1]++,a[i]-=10;
	}
	if(a[a[0]+1]>0) a[0]++; //如果最高位上有进位,则结果位数要加一位
	return;
}
void Out(int a[]){
	for(int i=a[0];i>0;i--)cout<<a[i]; //倒序输出每一位,有时候需要处理最高位上有0的情况,具体情况再具体处理
	return;
}