1 条题解
-
0
一、题意分析 题目描述了一个类似公文包密码锁的锁定旋转器拼图。该拼图由一排 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
- 上传者