专栏文章

题解:AT_iroha2019_day3_k えそらんぐ

AT_iroha2019_day3_k题解参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@mir1xkmb
此快照首次捕获于
2025/12/04 14:25
3 个月前
此快照最后确认于
2025/12/04 14:25
3 个月前
查看原文
大模拟,个人感觉没有 struct 难(
一看题意,只有 8 种操作,前 6 种是移动指针、自增自减和输入输出。那么后 2 种就比较有用,相当于一个 while 循环,当然也可以当 if 用。
乍一看根本不知道怎么用这东西实现加法,于是我们尝试使用封装思想,一步步建立这种语言的各种操作。
假设我们钦定每对 [] 之间的 <> 数目相同,那么我们便可以知道在程序执行到任意位置时指针指向的内存编号。
从实现来讲,我们存储全局变量 pp 表示当前位置。

Access(x)

将指针指向 xx,直接输出对应个 <> 后更新 pp 即可。

Add(x,c)

将内存 xx 加上 cc,其中 cc 是一个常量。
access 后直接输出 +- 即可。

Read(x) / Write(x)

输出第 xx 个内存的值,为了方便运算,我们输入时将其减去 48480 的 ASCII 值),输出时加回去。
access, add 后输出 ,. 即可

Loop(x) / End()

我们定义 loop(x) ... end() 等价于 while(x) { ... },即调用 loop 就设置循环,调用 end 就标记循环停止,并且当 xx 不为 00 时循环执行。
那我们在 loopaccessxx,然后输出 [ 开始循环;在 end 时再次 accessxx,然后输出 ] 结束循环。

Addto(x,S)

xx 加到 iS\forall i \in S 中,并清空 xx
直接用循环暴力自增自减即可。

到这里,我们已经实现了大部分一个语言具有的功能,甚至已经可以实现不进位加法。那么我们唯一需要处理的就是进位。
考虑什么时候需要进位,当且仅当两个相同数位上的和大于等于 10。
那我们如何判断呢?比较运算符不是很好写,但是我们只需检查当前的数是否在 [0,9][0,9] 之间即可,于是可以暴力枚举判断是否相等。
那么怎么判相等呢?容易发现我们可以判断他们的差是否为 00,于是就做完了。
细节见 code

评论

0 条评论,欢迎与作者交流。

正在加载评论...