对于一个int类型的整数来说,计算机会用一个32位的2进制数组去存储,数据范围为-2^31
-
2^31 -1 ,如果数据超出了这个范围,直接对int类型整数做加法就会出现错误,要想实现位数特别大的整数加法,我们需要用字符类型的数组来帮助运算。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void bigDataAdd(char* data_a, char* data_b) {
int length_a = strlen(data_a);
int length_b = strlen(data_b);
int i;
char* c = (char*) malloc (sizeof(char) * length_b );
if (length_b > length_a) {
for (i = 0; i < length_a; i++) {
c[i] = data_a[i];
}
c[i] = '\0';
for (i = 0; i < length_b; i++) {
data_a[i] = data_b[i];
}
data_a[i] = '\0';
for (i = 0; i < length_b; i++) {
data_b[i] = c[i];
}
data_b[i] = '\0';
}
free(c);
length_a = strlen(data_a);
length_b = strlen(data_b);
i = length_a - 1;
int j = length_b - 1;
int flag = 0;
int* pres = ( int *) malloc( sizeof( int) * ( length_a + length_b));
memset(pres, 0, sizeof( int)*( length_a + length_b) );
for (; i >= 0; i--, j--) {
if (j >= 0) {
pres[length_a - i - 1] += (data_a[i] - '0') + (data_b[j] - '0');
}
else {
pres[length_a - i - 1] += (data_a[i] - '0');
}
}
for (int i = 0; i < length_a + length_b; i++) {
if (pres[i] >= 10) {
pres[i + 1] += pres[i] / 10;
pres[i] %= 10;
}
}
char* d = (char*) malloc (sizeof(char) * (length_a + length_b) );
j = 0;
for (i = length_a + length_b - 1; i >= 0; i--) {
if (pres[i] != 0) {
flag = 1;
}
if (flag) {
d[j] = pres[i] + '0';
j++;
}
}
free(pres);
d[j] = '\0';
printf("%s\n", d);
free(d);
}
int main() {
char str1[100] = {0};
char str2[100] = {0};
scanf("%s%s", str1, str2);
bigDataAdd(str1, str2);
return 0;
}