1 条题解
-
0
解题算法原理
该代码用于解决整数加法(可能涉及减法,取决于输入数的符号)问题,基本原理是基于对整数的数位拆分与模拟计算。通过将输入的整数按数位存储在数组中,然后根据整数的符号情况,运用加法或减法运算规则,逐位进行计算,最终得到结果并输出。
算法步骤
一.初始化与数据预处理(ini函数)
1.确定存储结果的数组长度L,取两个输入字符串A、B 长度的较大值再加 10,为后续计算预留足够空间。
2.初始化数组a、b、c全为 0,用于存储两个输入数的数位和计算结果的数位。
3.判断输入字符串A、B的首字符是否为'-',以此确定两个数的符号,分别用flag1、flag2标记。
4.从输入字符串的末尾开始,将数字字符转换为整数并存储到数组a、b中,实现数位拆分。
二.加法运算(add函数)
1.从最低位(数组下标 0)开始,逐位将数组x、y对应位置的数字相加,并加上进位p。
2.计算当前位的结果c[i],并更新进位p(p = c[i] / 10),同时将c[i]对 10 取模得到该位实际存储的值。
三.减法运算(sub函数)
1.同样从最低位开始,逐位计算数组x与y对应位置数字的差,并加上借位p。
2.若结果c[i]小于 0,则加上 10 并设置借位p = -1;否则借位p = 0。
四.比较大小(les函数)
1.从数组的最高位(下标maxN - 1)开始,逐位比较数组x和y对应位置的数字。
2.若遇到不相等的位,根据对应位数字大小返回比较结果(x[i] < y[i]时返回 1,否则返回 0);若所有位都相等,返回 0。
c++代码:
#include <iostream> #include <cstring> #include <cstdio> // 添加此头文件,用于声明scanf和printf using namespace std; const int maxN = 60000; char A[maxN], B[maxN]; int L, flag1, flag2, flag3, a[maxN], b[maxN], c[maxN]; // 以下函数定义部分保持不变 void ini() { L = max(strlen(A), strlen(B)) + 10; for (int i = 0; i < maxN; ++i) { a[i] = 0; b[i] = 0; c[i] = 0; } flag1 = 0; flag2 = 0; flag3 = 0; if (A[0] == '-') { flag1 = 1; } if (B[0] == '-') { flag2 = 1; } int t = 0; for (int i = strlen(A) - 1; i >= 0; --i) { if (A[i] >= '0' && A[i] <= '9') { a[t++] = A[i] - '0'; } } t = 0; for (int i = strlen(B) - 1; i >= 0; --i) { if (B[i] >= '0' && B[i] <= '9') { b[t++] = B[i] - '0'; } } } void add(int x[], int y[]) { int p = 0; for (int i = 0; i <= L; ++i) { c[i] = x[i] + y[i] + p; p = c[i] / 10; c[i] %= 10; } } void sub(int x[], int y[]) { int p = 0; for (int i = 0; i <= L; ++i) { c[i] = x[i] - y[i] + p; if (c[i] < 0) { c[i] += 10; p = -1; } else { p = 0; } } } int les(int x[], int y[]) { for (int i = maxN - 1; i >= 0; --i) { if (x[i] != y[i]) { return x[i] < y[i]; } } return 0; } int main() { int cases; scanf("%d", &cases); while (cases--) { scanf("%s%s", A, B); ini(); if (!flag1 && !flag2) { add(a, b); } else if (flag1 && flag2) { add(a, b); flag3 = 1; } else if (!flag1 && flag2) { if (les(b, a)) { sub(a, b); } else { sub(b, a); flag3 = 1; } } else { if (les(a, b)) { sub(b, a); } else { sub(a, b); flag3 = 1; } } int i; for (i = maxN - 1; i >= 0; --i) { if (c[i] > 0) { break; } } if (i < 0) { printf("0\n"); } else { if (flag3) { printf("-"); } for (int j = i; j >= 0; --j) { printf("%d", c[j]); } printf("\n"); } flag1 = flag2 = flag3 = 0; } return 0; }
- 1
信息
- ID
- 1756
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 9
- 已通过
- 1
- 上传者