问题:用顺序存储的线性表实现大数相加,如23400897654676453—009876加2345678904567332—8765,随机实现50位的两个大数实现加法
大数相加和顺序表有啥关系呢?
所谓线性表,就是数组而已,以下代码支持1000位计算。
#include<stdio.h>
#include<string.h>
#define MAX(a,b) a>b?a:b
int main() {
int n = 0,i,j,num=0,lengh,lengh_a1,lengh_a2,flag;
char a1[1002], a2[1002];//字符数组存大数
scanf("%d", &n);
for (j = 0; j < n; j++) {
scanf("%s%s", &a1, &a2);
lengh_a1 = strlen(a1);//读输入到两个字符数组中的元素个数,用于转换成整形数组
lengh_a2 = strlen(a2);
int c1[1002] = { 0 }, c2[1002] = { 0 }, c3[1003] = { 0 };//定义在循环内部,每次都会初始化一次(在外面好像也没遇到错误)
for (i = 0; i < lengh_a1; i++) {
c1[i] = a1[lengh_a1 - i - 1]-48;//倒着把字符数组的元素输入到整形数组中
}
for (i = 0; i < lengh_a2; i++) {
c2[i] = a2[lengh_a2 - i - 1]-48;
}
lengh = MAX(lengh_a1, lengh_a2);//两数组最长的长度
for (i = 0; i <lengh; i++) {
flag = 0;//用来看最后一次循环是否进位,在输出的时候用到了
c3[i] = c1[i] + c2[i]+ num;//如果进位,加num
num = 0;
if (c3[i] >= 10) {
c3[i + 1] = 1;//进位,因为这层循环到c3[lengh-1]为止,这样写使c3[lengh]可以获得到进位。
num = 1;
c3[i] -= 10;
flag = 1;
}
}
num = 0;//防止上一组数的进位Num影响到下一组数
printf("case%d:\n",j+1);//输出
printf("%s + %s = ", a1, a2);
for (i = lengh + flag -1; i >= 0; i--)
printf("%d", c3[i]);
if (j + 1 != n) printf("\n\n");
else printf("\n");
}
return 0;
}