1 条题解

  • 0
    @ 2025-4-7 16:18:23

    一、题意分析 题目描述了一个类似公文包密码锁的锁定旋转器拼图。该拼图由一排 D 个编号的轮子组成,每个轮子上标记有数字 0 到 9。

    输入信息: 第一行输入是一个长度为 D(最多 10 位)的字符串,表示轮子的起始位置。 后续每行输入是一个 D 位数字的字符串,代表按下的按钮标签。输入会持续进行,直到文件结束(EOF)。

    操作规则:每个按钮标签对应一种对轮子的操作,按钮标签的每一位数字表示对应位置的轮子要转动的次数。例如,按钮标签为 1003,则表示第一个轮子转动 1 次,第二个轮子转动 0 次,第三个轮子转动 0 次,第四个轮子转动 3 次。 输出要求:根据输入的轮子起始位置和一系列按钮操作,计算并输出轮子的最终位置,以数字形式表示。

    二、解题思路

    数据存储: 使用字符数组 s[MAX_N] 来存储输入的轮子起始位置和按钮标签字符串。 使用整型数组 ints[MAX_N] 来存储当前输入的按钮标签转换后的数字数组,方便进行后续的计算。 使用整型数组 ans[MAX_N] 来存储轮子的最终状态,初始化为 0。

    读取起始位置:通过 scanf("%s", s + 1) 读取轮子的起始位置字符串,并计算其长度 l。然后通过循环 REP(i, 1, l) ints[l - i + 1] = s[i] - '0'; 将字符串转换为数字数组,并且将数字顺序反转存储,这样做的目的是为了后续计算时从低位到高位进行处理更加方便。

    处理按钮操作:使用一个外层 while 循环 while(scanf("%s", s + 1) != EOF) 来持续读取按钮标签字符串。对于每一个读取到的按钮标签: 同样计算其长度并转换为数字数组存储在 ints 数组中。 然后通过内层循环 while(i <= l) 遍历每一位数字,将 ans 数组对应位置的数字加上 ints 数组对应位置的数字,并对 10 取模,以确保数字在 0 到 9 之间。

    输出结果:最后通过循环 REP_(i, 1, l) printf("%d", ans[i]); 从高位到低位输出 ans 数组,得到轮子的最终位置。

    三、代码实现细节 宏定义:使用宏定义 REP(i, s, n) for(int i = s; i <= n; i ++) 和 REP_(i, s, n) for(int i = n; i >= s; i --) 来简化循环的书写,提高代码的可读性。

    数组初始化:使用 memset(ans, 0, sizeof(ans)); 将 ans 数组初始化为 0,确保轮子的最终状态从初始状态开始计算。 字符串与数字转换:通过 s[i] - '0' 将字符转换为对应的数字,实现字符串到数字数组的转换。

    参考代码:

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #define REP(i, s, n) for(int i = s; i <= n; i ++)
    #define REP_(i, s, n) for(int i = n; i >= s; i --)
    #define MAX_N 10 + 5
    
    using namespace std;
    
    int main(){
        char s[MAX_N];
        int ints[MAX_N], ans[MAX_N];
        memset(ans, 0, sizeof(ans));
        int l;
        while(scanf("%s", s + 1) != EOF){
            l = strlen(s + 1);
            REP(i, 1, l) ints[l - i + 1] = s[i] - '0';
            int i = 1;
            while(i <= l){
                ans[i] = (ans[i] + ints[i]) % 10;
                i ++;
            }
        }
        REP_(i, 1, l) printf("%d", ans[i]);
        return 0;
    }
    • 1

    信息

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