|
发表于 2018-10-10 00:23:42
|
显示全部楼层
本楼为最佳答案
由于数字的长度有限制,因此大数加法的位数也是有限的,
所以可以换种思路,把输入输出均看成字符串,然后对字符串处理(跟我们列竖式一样)
一位运算很容易,我们可以使用+进行运算
并且我们很容易知道每一位的结果都由这一位的 加数 和 被加数 以及上一位的 进位 来决定。
当这三者的和超过10 便是进位,对10取余便是本为的结果。用这种方法理论上我们可以实现无限多位的数相加(只要你内存够大,分配大点的数组存放即可)
- #include <stdio.h>
- #include <string.h>
- void main( ) {
- char a[1000], b[1000], c[1001] = {0}, flag = 0; /*c:存放结果,flag:进位信息*/
- int i, j, k, m, n, len; /*i:跟踪a的下标,j:跟踪b的下标,k:跟踪c的下标*/
- scanf("%s%s", a, b);
- m = strlen(a);
- n = strlen(b);
- len = (m > n) ? m : n;
- /*相加时,先将右边对齐,即将i指向a的右端,j指向b的右端,
- 然后i、j对齐,同步向左移动,直到其中一个到头为止*/
- for(i = m - 1, j = n - 1, k = len - 1; i >= 0 && j >= 0; i--, j--, k--)
- {
- c[k] = (a[i] - '0' + b[j] - '0' + flag) % 10 + '0';
- flag = (a[i] - '0' + b[j] - '0' + flag) / 10;
- }
- for(; i >= 0; i--, k--) /*若a更长,即a没有处理完,处理a剩下的高位部分*/
- {
- c[k] = (a[i] - '0' + flag) % 10 + '0';
- flag = (a[i] - '0' + flag) / 10;
- }
- for(; j >= 0; j--, k--) /*若b更长,则方法同上*/
- {
- c[k] = (b[j] - '0' + flag) % 10 + '0';
- flag = (b[j] - '0' + flag) / 10;
- }
- if(flag != 0) /*若最终的最高位进位信息不为0*/
- {
- for(k = len; k > 0; k--)
- c[k] = c[k - 1];
- c[0] = flag + '0';
- }
- printf("%s + %s = %s\n", a, b, c);
- }
复制代码 |
|