采用竖式计算,条件是正整数A-B。 A>=B
采取和大数加法相同的方法。
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 | /**************************************************************** * Description: 大数减法 * Author: Alex Li * Date: 2024-01-31 05:08:16 * LastEditTime: 2024-01-31 05:10:55 ****************************************************************/ #include <iostream> #include <string> #include <algorithm> using namespace std; const int MAXN = 10005; // 最大数字长度 int A[MAXN], B[MAXN], C[MAXN], Ans[MAXN], Len_A, Len_B, Len_Ans; // 定义数组和长度变量 // 读取大数字并存储为数组,低位在前 void Read(int *arr, int &Len) { string cur; cin >> cur; // 读取一个大数字字符串 Len = cur.length(); // 计算数字长度 for (int i = 0; i < Len; i++) { arr[i] = cur[i] - 48; // 将字符转换为数字并存储 } reverse(arr, arr + Len); // 反转数组,以便低位在前 } int main() { Read(A, Len_A); // 读取第一个数 Read(B, Len_B); // 读取第二个数 Len_Ans = max(Len_A, Len_B); // 确定结果的最大长度 for (int i = 0; i <= Len_Ans; i++) { Ans[i] = A[i] - B[i] - C[i]; // 执行逐位减法,并考虑借位 if (Ans[i] < 0) { // 如果当前位结果为负数,需要从高位借位 C[i + 1]++; // 高位减1 Ans[i] = Ans[i] + 10; // 当前位加10 } } // 去除结果前导0 while (Len_Ans > 0 && Ans[Len_Ans - 1] == 0) Len_Ans--; // 从高位到低位输出结果 for (int i = Len_Ans - 1; i >= 0; i--) { cout << Ans[i]; } return 0; } |
练习:洛谷P2142