高精A+B
提供两种思路,分别是用字符数组存储每一位进行计算(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] = { '\0' }; char b[MAXSIZE] = { '\0' }; int flag = 0; scanf("%s",a); scanf("%s",b); int i, j; char* big; char* small; if (strlen(a) < strlen(b)) { big = b; small = a; } else { big = a; small = b; } i = strlen(big) - 1; j = strlen(small) - 1; while (j!=-1) { int tmp = small[j] + big[i] + flag; if (tmp > '0' + '9') { flag = 1; tmp = tmp - '9' - 1; } else { tmp = tmp - '0'; flag = 0; } big[i] = tmp; i--; j--; } while (i != -1) { int tmp = flag + big[i]; if (tmp > '9') { flag = 1; tmp = tmp - 10; } else { flag = 0; } big[i] = tmp; i--; } if(flag) printf("1%s", big); else printf("%s", big); return 0; }
利用整数数组存储大整数进行计算,
整体原理和字符数组的第一种相同,也是最常见的
#include <stdio.h> #include <string.h> char a[502], b[502]; int num1[502], num2[502];//元素值默认为0,这个在后面的计算很重要,将两个大整数统一成长度为501的数,如果用局部变量,还需要初始化为0才有这样的效果 int main() { scanf("%s", a); scanf("%s", b); int len1 = strlen(a), len2 = strlen(b),len=0; for (int i = 0; i < len1; i++) num1[i] = a[len1 - 1 - i] - '0'; for (int i = 0; i < len2; i++) num2[i] = b[len2 - 1 - i] - '0'; len = (len1 >= len2) ? len1 : len2; for (int i = 0; i < len; i++) { num1[i + 1] += (num2[i] + num1[i]) / 10; num1[i] = (num2[i] + num1[i])% 10; } if (num1[len] == 1) len++; for (int i = len - 1; i >= 0; i--) printf("%d", num1[i]); return 0; }