1 条题解

  • 0
    @ 2025-5-6 20:23:18

    简单解题思路

    问题描述:

    给定一个大数(用字符串表示)和一个整数 b,通过以下步骤生成一个结果数组:

    1. 计算大数对 b 取模的值(如果模为 0,则取 b)。
    2. 从大数中减去这个模值。
    3. 将大数除以 b
    4. 重复上述步骤,直到大数变为 0。
    5. 最后将存储的模值逆序输出。

    核心步骤:

    1. 取模:计算当前大数对 b 的余数(若余数为 0,则改为 b)。
    2. 减法:从大数中减去这个余数。
    3. 除法:将大数除以 b
    4. 存储结果:将余数存入数组,重复直到大数为 0。
    5. 输出:逆序输出数组中的余数。

    示例:

    • 输入:b = 3data = "10"(即十进制 10)
      1. 10 % 3 = 1 → 存 1,10 - 1 = 9,9 / 3 = 3
      2. 3 % 3 = 0 → 存 3,3 - 3 = 0,0 / 3 = 0
      3. 结束,数组为 [1, 3],逆序输出 "31"

    关键点:

    • 用字符串处理大数,避免溢出。
    • 每次迭代确保余数在 [1, b] 范围内(模 0 时取 b)。
    • 逆序输出结果。
    #include <cstdio>
    #include <cstring>
    
    #define N 105
    
    int b;
    int ans[4 * N];
    int cnt;
    char data[N];
    char tmp[N];
    
    // 计算 data 表示的数对 b 取模的结果
    int mod() {
        int ret = 0;
        int len = strlen(data);
        for (int i = 0; i < len; ++i) {
            ret = (ret * 10 + data[i] - '0') % b;
        }
        return ret % b;
    }
    
    // 判断 data 是否为 1 后面跟若干个 0 的形式
    bool judge() {
        int len = strlen(data);
        if (data[0] != '1') {
            return false;
        }
        for (int i = 1; i < len - 1; ++i) {
            if (data[i] != '0') {
                return false;
            }
        }
        return true;
    }
    
    // 从 data 表示的数中减去 x
    void sub(int x) {
        int len = strlen(data);
        if (data[len - 1] - '0' >= x) {
            data[len - 1] -= x;
        } else if (judge()) {
            for (int i = 0; i < len - 2; ++i) {
                data[i] = '9';
            }
            data[len - 2] = data[len - 1] + 10 - x;
            data[len - 1] = '\0';
        } else {
            int y = len - 2;
            data[len - 1] += 10 - x;
            while (data[y] == '0') {
                data[y] = '9';
                y--;
            }
            data[y]--;
        }
    }
    
    // 将 data 表示的数除以 b
    void div() {
        int x = 0;
        int len = strlen(data);
        int ret = 0;
        int i = 0;
        if (data[0] - '0' < b) {
            ret += data[0] - '0';
            i++;
        }
        for (; i < len; ++i, ++x) {
            ret = ret * 10 + data[i] - '0';
            tmp[x] = ret / b + '0';
            ret %= b;
        }
        tmp[x] = '\0';
        memcpy(data, tmp, sizeof(data));
    }
    
    int main() {
        int i;
        scanf("%d", &b);
        scanf("%s", data);
        if (data[0] == '0') {
            printf("\n");
        } else {
            cnt = 0;
            while (true) {
                ans[cnt] = mod();
                if (ans[cnt] == 0) {
                    ans[cnt] = b;
                }
                sub(ans[cnt]);
                div();
                cnt++;
                if (data[0] == '0' || strlen(data) == 0) {
                    break;
                }
            }
            for (i = cnt - 1; i >= 0; --i) {
                printf("%d", ans[i]);
            }
            printf("\n");
        }
        return 0;
    }    
    
    
    • 1

    信息

    ID
    895
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    4
    已通过
    1
    上传者