1 条题解

  • 0
    @ 2025-5-28 20:52:40

    解题算法原理

    该代码用于解决整数加法(可能涉及减法,取决于输入数的符号)问题,基本原理是基于对整数的数位拆分与模拟计算。通过将输入的整数按数位存储在数组中,然后根据整数的符号情况,运用加法或减法运算规则,逐位进行计算,最终得到结果并输出。

    算法步骤

    一.初始化与数据预处理(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
    上传者