2 条题解

  • 0
    @ 2023-1-20 19:13:39

    某管理说我ctj了

    那我就展示下我ctj的代码

    // 高精度模板代码,注意代码中都没有考虑负数情况,题目中出现了负数则需要加一些判断和处理(自己之前写的)
    #include <cstdio>
    #include <cstring>
    #include<iostream>
    using namespace std;
    // 高精度实现中,一般令数组的最大长度LEN比输入和结果大一些,这样可以省去不少边界情况的处理
    const int LEN = 5100;
    int a[LEN], b[LEN], c[LEN];
    char s[LEN];
    // read()读取一个大整数并反转存放在num数组中,返回读入的整数长度
    int read(int num[]) {
        memset(num, 0, sizeof(int) * LEN);
        scanf("%s", s);
        int len = strlen(s);
        for (int i = 0; i < len; i++) {
            num[i] = s[len-1-i] - '0';
        }
        return len;
    }
    // print()输出大整数num
    void print(int num[]) {
        int i;
        // 这里i>=1而不是1>=0是因为当整个数字等于0时仍希望输出一个字符0
        for (i = LEN - 1; i >= 1; i--) {
            if (num[i] != 0) break;
        }
        for (; i >= 0; i--) putchar(num[i] + '0');
    }
    // geq()判断num1是否大于等于num2。la、lb分别为num1、num2的长度
    bool geq(int la, int lb, int num1[], int num2[]) {
        if (la != lb) return la > lb;
        for (int i = la - 1; i >= 0; i--) {
            if (num1[i] > num2[i]) return true;
            else if (num1[i] < num2[i]) return false;
        }
        return true;
    }
    // add()计算num1+num2,将结果存在res数组中
    void add(int num1[], int num2[], int res[]) {
        memset(res, 0, sizeof(int) * LEN);
        for (int i = 0; i < LEN - 1; i++) {
            res[i] += num1[i] + num2[i];
            if (res[i] >= 10) { // 进位
                res[i+1]++;
                res[i] -= 10;
            }
        }
    }
    // sub()计算num1-num2,将结果存在res数组中
    void sub(int num1[], int num2[], int res[]) {
        memset(res, 0, sizeof(int) * LEN);
        for (int i = 0; i < LEN - 1; i++) {
            res[i] += num1[i] - num2[i];
            if (res[i] < 0) { // 借位
                res[i+1]--;
                res[i] += 10;
            }
        }
    }
    // mul()计算num1*num2,将结果存在res数组中
    void mul(int num1[], int num2[], int res[]) {
        memset(res, 0, sizeof(int) * LEN);
        for (int i = 0; i < LEN - 1; i++) {
            // 这里直接计算结果中的从低到高第 i 位,且一并处理了进位
            // 第 i 次循环为 res[i] 加上了所有满足 p + q = i 的 num1[p] 与 num2[q] 的乘积之和
            for (int j = 0; j <= i; j++) {
                res[i] += num1[j] * num2[i-j];
            }
            if (res[i] >= 10) {
                res[i+1] += res[i] / 10;
                res[i] %= 10;
            }
        }
    }
    // div()计算num1/num2的商,存在res数组中,并返回余数,注意这里num2是单精度整数,不是高精度
    int div(int num1[], int num2, int res[]) {
        memset(res, 0, sizeof(int) * LEN);
        for (int i = LEN - 1; i >= 0; i--) {
            res[i] = num1[i] / num2;
            // 注意此处num2即使在int范围内,*10之后可能超过int范围,此时num1数组需要使用long long类型
            if (i > 0) num1[i-1] += num1[i] % num2 * 10;
        }
        return num1[0] % num2;
    }
    long long x,y;
    int main() {
        char s;
        read(a);
        cin>>s;
        read(b);
        if(s=='+'){
            add(a,b,c);
        }
        if(s=='*'){
            mul(a,b,c);
        }
        if(s=='-'){
            sub(a,b,c);
        }
        print(c);
    }
    
    

    信息

    ID
    3
    时间
    1000ms
    内存
    256MiB
    难度
    6
    标签
    递交数
    40
    已通过
    13
    上传者