大数加法
组别:入门级
难度:4
洛谷:P1601、P1009
OJ平台:P1260,、LD1117、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 | /**************************************************************** * 代码作者: Alex Li * 创建时间: 2026-05-04 23:15:31 * 最后修改: 2026-05-04 23:33:39 * 文件描述: 大数加法 ****************************************************************/ #include <iostream> #include <string> #include <algorithm> using namespace std; string addBigNumbers(string a, string b) { string result = ""; int i = a.length() - 1; // 指向 a 的末尾 int j = b.length() - 1; // 指向 b 的末尾 int carry = 0; // 进位标识 // 只要还有位没加完,或者还有进位,就继续循环 while (i >= 0 || j >= 0 || carry > 0) { int sum = carry; // 先加上上一轮的进位 if (i >= 0) { sum += a[i] - '0'; // 将字符转化为整数 i--; } if (j >= 0) { sum += b[j] - '0'; j--; } carry = sum / 10; // 计算新的进位 result += (sum % 10) + '0'; // 取个位数转回字符,存入结果 } // 因为是从个位开始加的,所以结果是反的,需要翻转回来 reverse(result.begin(), result.end()); return result; } int main() { string num1, num2; cin >> num1>> num2; string sum = addBigNumbers(num1, num2); cout << "相加结果为: " << sum << endl; 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; } |
