提供两种思路,分别是用字符数组存储每一位进行计算(2种代码)和用int数组存储每一位进行计算(1种代码)
常见的做法是用int数组存储计算,这种方法比字符数组可以少考虑几个麻烦,推荐用int数组存储计算
当时看到可以用字符串存储大整数,就一直用字符数组存储计算,计算过程中需要进行字符‘n’和数字n的转换,还要取余、取模,感觉非常别扭,后来看到别人用整数数组存储计算,恍然大悟,觉得自己好傻~
用字符数组计算主要有两个麻烦,
第一个,用ASCII码进行计算,因为涉及到取余和取模,就很别扭,但是仍然可以通过减去'0'模拟数字的计算,最后加上'0'变回ASCII码
第二个,这个比较头疼,就是当两个数a,b的长度不同时,很难把共有位的计算和独有位的计算统一起来(反正我觉得很难),
针对第二个麻烦,有三种思路,
可以将两个字符数组全部初始化为'0',这样相当于长度为500(下面字符数组所能存储的最大长度)的两个大整数相加,长度相同了,
可以将共有位的计算公式和独有位的区别开,用if……else……
也可以慢慢想,直到想出一个可以统一两种情况的公式,
字符数组的高精加法写了两种,
第一种,倒序存储大整数,并且统一了两种情况
#include <stdio.h> #include <string.h> char a[501], b[501], num1[501], num2[501]; int main() { scanf("%s", a); scanf("%s", b); int len1 = strlen(a), len2 = strlen(b); if (len1 >= len2)//将整数倒序存储,且较长的数用num1[]存放 { for (int i = 0; i < len1; i++) num1[i] = a[len1 - 1 - i]; for (int i = 0; i < len2; i++) num2[i] = b[len2 - 1 - i]; } else { for (int i = 0; i < len1; i++) num2[i] = a[len1 - 1 - i]; for (int i = 0; i < len2; i++) num1[i] = b[len2 - 1 - i]; } len1 = strlen(num1);//len1代表较长的数的长度,len2代表较短的 len2 = strlen(num2); for (int i = 0; i < len1; i++)//用ASCII码进行计算,比较麻烦 { num1[i + 1] += (num2[i]-'0' + num1[i]-'0') / 10; num1[i] = (num2[i]-'0' + num1[i]-'0') % 10+'0'; } if (num1[len1] == 1) num1[len1] += '0'; for (int i = strlen(num1) - 1; i >= 0; i--) printf("%d", num1[i]-'0'); return 0; }
第二种,顺序存储大整数,模仿n位全加器进行计算,对于两数长度不同的情况进行了讨论,(这是最早写的代码,看着有点不一样)
#include <stdio.h> #include <math.h> #include <string.h> #define MAXSIZE 600 int main() { char a[MAXSIZE] = { '