大数加法
大数加法很简单,只需要模拟我们平常的加法运算,然后把结果用字符串来存下就行,难度不大。如果想做带有负数的加法,只需要做点小改动就行。我就只写正数的了,
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;
const int SIZE = 1e5;
int main() {
bool jinwei = false;//记录是否可以进1位
int len1, len2, len3, m1, m2, m3;//len1为a1长度,len2为a2长度,len3为a3长度,m1,m2,m3分别为记录a1,a2,a3开始遍历的位置
char a1[SIZE], a2[SIZE], a3[SIZE];
memset(a1, '\0', sizeof(a1));
memset(a2, '\0', sizeof(a2));
memset(a3, '\0', sizeof(a3));
scanf("%s%s", a1, a2);
len1 = strlen(a1), len2 = strlen(a2);
m1 = len1-1, m2 = len2-1, m3 = 0;
for(int i = 0; i < max(len1, len2); i++) {
int j1, j2, j3;
if(m1 >= 0 && m2 >= 0) { //如果遍历的位置都还有数字就相加
j1 = a1[m1--]-'0';
j2 = a2[m2--]-'0';
j3 = j1 + j2;
if(jinwei)
j3++;
if(j3 >= 10) //如果两数字相加为两位,进位,jinwei记录状态
jinwei = true;
else
jinwei = false;
a3[m3++] = j3%10 + '0';
} else if(m1 < 0) { //如果只有一个数字,就相当于它加零
j3 = a2[m2--]-'0';
if(jinwei)
j3++;
if(j3 >= 10)
jinwei = true;
else
jinwei = false;
a3[m3++] = j3%10 + '0';
} else if (m2 < 0) {
j3 = a1[m1--]-'0';
if(jinwei)
j3++;
if(j3 >= 10)
jinwei = true;
else
jinwei = false;
a3[m3++] = j3%10 + '0';
}
}
if(jinwei)
a3[m3++] = 1 + '0';//可能它们都没有数字了,但是有进位
len3 = strlen(a3);
for(int i = len3-1; i >= 0; i--) {
printf("%c", a3[i]);
}
printf("\n");
return 0;
}