1 条题解

  • 0
    @ 2025-8-24 21:58:30

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar 见贤思齐_Seakies
    JxsQ_Guo

    搬运于2025-08-24 21:58:30,当前版本为作者最后更新于2021-10-05 13:09:42,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    题目链接


    题意概述

    现在有两个 nn 位数,每一位的进制不同,第 ii 位为 xix_i 进制,要求他们两个的和或差。


    题目分析

    一看这道题,大家应该就会想到高精度,首先我们把它分为两种情况,第一种情况是计算和,第二种情况为计算差。

    我们通过高精度,模拟题意,分别计算出和与差,最后输出,输出时要注意,最后一个数字后面没有空格

    那么我们如何计算和与差呢?

    和:首先,我们先计算出每一位的和,然后,我们进行进位操作。

    差:与和一样,先计算出差后,如果小于零,便不断地向高位借位,直到得到的数大于等于零为止。

    注意:我们输入的时候是从高位开始的,所以,我们进行操作的时候要倒着循环。

    详细解释请看代码:


    代码

    #include <bits/stdc++.h> // 万能头 
    using namespace std;
    int n;
    int x[100005], a[100005], b[100005], sum[100005]; // x 为进制,a 和 b 为两个变进制数,sum 记录和与差
    /* ---------------------------------------------- */ 
    void he() {
        for (int i = n; i >= 1; i--) { // 注意要倒序
            sum[i] += a[i] + b[i]; // 算和 
            a[i - 1] += sum[i] / x[i]; // 让下一位加上这一位多的数
            // 注意:我们这里是倒序的,因此,上一位应是 i - 1,下面的减法也一样
            sum[i] %= x[i]; // 当前这一位的和对进制取模
            // 进位 
        }
    } // 计算加法 
    void cha() {
    	for (int i = n; i >= 1; i--) {
            sum[i] = a[i] - b[i]; // 算差 
            while (sum[i] < 0) { // 如果求出的差为负就不断借,直到大于零为止
            // 注意:这里一定要用循环,不能只用一个 if,因为你只借一次可能不够用
            	a[i - 1]--; // 让上一位减一
            	sum[i] += x[i]; // 当前这一位加上借的这一位,借的数就是上一位的进制
    		} // 向高位借位 
        }
    } // 计算减法 
    	// 核心部分
    /* ---------------------------------------------- */
    int main() {
        cin >> n;
        for (int i = 1; i <= n; i++) {
            cin >> x[i];
        }
        for (int i = 1; i <= n; i++) {
            cin >> a[i];
        }
        char c;
        cin >> c;
        for (int i = 1; i <= n; i++) {
            cin >> b[i];
        }
        // 输入
    /* ---------------------------------------------- */
        if (c == '+') {
            he();
        } else {
            cha();
        }
    /* ---------------------------------------------- */
        for (int i = 1; i < n; i++) {
            cout << sum[i] << ' ';
        } // 这里正序输出就可以了
        cout << sum[n] << endl; // 注意:这里最后一个数的后面不能有空格
        // 输出
        return 0; // return 是个好习惯
    } // ~ 完美结束!~
    

    ACAC 记录 (别忘了开 O2)

    于是,有的大佬就要问了,题目不是让你对 M+1M + 1 取模吗?

    其实是不用的,XX 进制的最大值是 MM ,那么 M mod (M+1)M\ mod\ (M + 1) 是不是还是 MM 呢?同样,所有比 M+1M + 1 小的数对它取模都等于本身


    题目推荐

    https://www.luogu.com.cn/problem/P1601

    https://www.luogu.com.cn/problem/P1303

    https://www.luogu.com.cn/problem/P1255

    https://www.luogu.com.cn/problem/P1009

    https://www.luogu.com.cn/problem/P1480


    本蒟蒻第一次写题解,希望对大家有帮助!

    最后再说一句,大家不要抄袭哦!

    • 1

    信息

    ID
    3250
    时间
    1000ms
    内存
    125MiB
    难度
    2
    标签
    递交数
    0
    已通过
    0
    上传者