1、题目:
由键盘输入两个超长整数,求两个整数的和,要求有数组的扩容与缩容
2、思路
须知:
(1)、两个数相加是从后往前相加的,大于十要进一,代码中需要体现出这一点
(2)、实现数组的扩容或缩容需要使用到指针,通过改变指针的指向可以实现数组的扩容与缩容
先定义三个指针,分别指向申请分配的三个连续的空间,在读取键盘数据的过程中判断空间是否已满,若空间不足或过多,则使用realloc()进行空间的扩容与缩容。
后把两个数组中的数一一相加并存到第三个数组即可。
3、读取并分配空间
先定义好需要的变量:char* a,*b,*c;三个指针。int size1,size2;两个存储数组大小的整数。
(1)、分配空间
使用malloc()函数进行连续空间的分配,返回值是一个指针,因为void malloc()本身是一个无类型指针,所以赋值时需要强制类型转换。
*a = (char*)malloc(LEN * sizeof(char));
char**a 表示指针的地址,通过改变*a才可以把改变后的数组返回到主函数中。
(2)、扩容与缩容
扩容或者缩容可以用realloc()函数实现,realloc(地址,LN*sizeof(char/int));如果LN比原来的数小,即为缩容,反之即为扩容。
*a = (char*)realloc(*a, size * sizeof(char));
4、两个数相加
i 为数组 a 中整数的个数
k 为数组 b 中的整数的个数
max 表示 i k 较大的数
如果最后相加的两位数大于10,则需要改变数组的容量(也可以一开始就分配多一点空间),然后把数组内的数往后移一位,最后把首元素赋值为1 即可
if (pre == 1) {
int j = size;
(*c) = (char*)realloc(*c, (size + 1) * sizeof(char));
while (j > 0) {
(*c)[j] = (*c)[j - 1];
j--;
}
(*c)[0] = '1';
}
最后返回两数之和,输出即可。
减法的话需要先判断两个数的大小,可以采用判断两个数位数的多少、逐个数判断等方法,最后大减小即可。