组别:入门级
难度:4
洛谷:P1601、P1009
OJ平台:T1173
模拟竖式计算方法:将将两个高精度数接位拆分后存到a[],b[]数组中,再用c[]数组存储进位,通过模拟加法竖式来计算结果。
方法一:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 | /**************************************************************** * Description: 大数加法 * Author: Alex Li * Date: 2023-07-07 21:45:54 * LastEditTime: 2024-01-31 05:06:23 ****************************************************************/ #include <iostream> #include <string> using namespace std; // 声明字符串来存储输入数字和数组来逐位存储它们的数字表示 string a1, b1; int a[101], b[101], c[102]; int main() { // 用于存储数字长度和其他实用变量的变量 int lena, lenb, lenc, i, x; cin >> a1; // 输入第一个大数字作为字符串 cin >> b1; // 输入第二个大数字作为字符串 lena = a1.length(); // 第一个数字的长度 lenb = b1.length(); // 第二个数字的长度 // 将第一个字符串(a1)以相反的顺序转换为整数数组 // 减去'0'是为了将字符数字转换为整数 for (i = 0; i < lena; i++) a[lena - i] = a1[i] - '0'; // 将第二个字符串(b1)以相反的顺序转换为整数数组 for (i = 0; i < lenb; i++) b[lenb - i] = b1[i] - '0'; // 初始化加法过程的变量 lenc = 1; // 和数组(c)的当前索引 x = 0; // 用于存储进位的变量 // 循环直到到达最长数字的末尾 while (lenc <= lena || lenc <= lenb) { c[lenc] = a[lenc] + b[lenc] + x; // 将对应的数字和进位相加 x = c[lenc] / 10; // 计算新的进位 c[lenc] %= 10; // 在去除进位后的当前位 lenc++; // 移动到下一位数字 } // 如果在最后一次操作后还有进位,将其加到结果中 c[lenc] = x; // 如果结果数组中的最后一个数字是0,减少结果的长度(以去除前导零) if (c[lenc] == 0) lenc--; // 以相反的顺序打印结果(因为结果是以相反的顺序存储的) for (i = lenc; i >= 1; i--) cout << c[i]; return 0; } |
方法二:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 | #include <iostream> #include <string> #include <algorithm> using namespace std; const int MAXN = 10005; // 最大数字位数 int A[MAXN], B[MAXN], Sum[MAXN]; // 被加数、加数、和 int Len_A, Len_B, Len_Sum; // 各数字的长度 void ReadNumber(int *arr, int &len) { string input; cin >> input; len = input.length(); for (int i = 0; i < len; i++) { arr[i] = input[i] - '0'; } reverse(arr, arr + len); } int main() { ReadNumber(A, Len_A); ReadNumber(B, Len_B); Len_Sum = max(Len_A, Len_B); // 逐位相加并直接处理进位 for (int i = 0; i < Len_Sum; i++) { Sum[i] += A[i] + B[i]; // 累加到当前位 // 直接处理进位 if (Sum[i] > 9) { Sum[i+1]++; // 进位到下一位 Sum[i] -= 10; // 当前位减10 } } // 检查最高位是否有进位 if (Sum[Len_Sum] > 0) { Len_Sum++; } // 输出结果 for (int i = Len_Sum-1; i >= 0; i--) { cout << Sum[i]; } return 0; } |