数字选择问题
LOGO编程答案

2024年厦门市教育局、厦门市科协官方联合举办的小学生信息学竞赛初赛LOGO语言编程笔试试卷中求解的问题是:“甲、乙、丙、丁四名同学分别从数字1~9中选出两个数字,他们之间选择的数字不能有重复。要求甲选的两个数字之和必须是10;乙选择的两个数字之差必须是1;丙选择的两个数字之积是24;丁选择的两个数字之商要是3。这样,4个人选择了8个数字,问:最后剩下的数字是多少?”
这个问题使用LOGO编程求解的思路和笔算推演走的是并不相同的路数。
LOGO编程依靠计算机自身的高速运算能力,不再是从问题的最薄弱处下手,而是用多重嵌套循环穷举所有的可能性,然后找到符合条件的答案。由于思路不同,所以编程的“路数”也是和笔算不相同的。
找甲选的两个数字(就是a1、a2):条件“两个数字之和必须是10”
for[a1 1
9][]
make "a2 10-:a1
找乙选的两个数字(就是b1、b2):条件“两个数字之差必须是1”
for [b1 1
8][]
make "b2 :b1+1
找丙选的两个数字(就是c1、c2):条件“两个数字之积是24”
for[c1 3
4][] 说明:选3、4以外的数字作为除数是没有意义的
make "c2 24/:c1
找丁选的两个数字(就是d1、d2):条件“两个数字之商要是3”
for[d1 3 9
3][] 说明:d1只能在3、6、9之间选
make "d2 :d1/3
然后将找到的一组8个数字组成一个字符串:sz。
make "sz
(word :a1 :a2 :b1 :b2 :c1 :c2 :d1 :d2)
接着用MSWLogo-FMSLogo命令集中特有的remdup命令去掉:sz字符串中可能重复的数字:
make "sz
remdup :sz
如果去掉了整个字符串中所有可能重复的字符以后,整个字符串还是8个字符那就说明已经找到了答案。
在MSWLogo-FMSLogo系统中memberp :i :sz表示 :i
这个数字包含在:sz字符串中。
not memberp :i :sz表示 :i
这个数字不包含在:sz字符串中。
下面的循环逐一用1~9和:sz比对。如果 :i 这个数字不包含在:sz字符串中,那么 :i
就是剩下的那个数字。
for[i 1
9][
if not
memberp :i :sz[]
;如果1-9中某个数字不在其中就是剩下的
最后要做的事就是输出查找答案。
计算机穷举搜索的结果有两组,仔细一看其实是一回事:剩下的数字都是7。从有类似的重复答案来看,计算机有点“傻”,人工笔算在得到正确的答案时,是不会有无效重复的答案的。
SZXZ
A 1 9
甲数字的和是10
B 4 5
乙两个数字的差是1
C 3 8
丙两个数字的乘积是24
D 6 2
丁两个数字的商是3
已经被选用过的数字
19453862
剩下的数字
7
A 9 1
甲数字的和是10
B 4 5
乙两个数字的差是1
C 3 8
丙两个数字的乘积是24
D 6 2
丁两个数字的商是3
已经被选用过的数字
91453862
剩下的数字
7
LOGO源程序:
to szxz
for[a1 1 9][
;甲选的数字和是10
make "a2
10-:a1
for [b1 1 8][
;乙选在数字差是1
make "b2
:b1+1
for[c1 3
4][
;丙选的数字积4是24
make "c2
24/:c1
for[d1 3 9
3][
;丁选是数字商是3
make "d2 :d1/3
make "sz (word :a1 :a2 :b1 :b2 :c1 :c2 :d1
:d2)
make "sz remdup :sz
;去掉出现重复的数字
if 8=count :sz[
;如果有8个不重复的数字说明找到了答案
for[i 1 9][
if not
memberp :i :sz[
;如果1-9中某个数字不在其中就是剩下的
(pr "A :a1 :a2 "甲数字的和是10)
(pr "B :b1 :b2 "乙两个数字的差是1)
(pr "C :c1 :c2 "丙两个数字的乘积是24)
(pr "D :d1 :d2 "丁两个数字的商是3)
(pr "已经被选用过的数字 :sz)
(pr "剩下的数字 :i)
pr[]
;产生一个隔离行继续找可能存在的答案
]]]]]]]
end
补充一:
前面说过,笔算求解类似这样的问题应当从问题总体的最“薄弱”处入手。
在甲乙丙丁四个人的条件要求中,丙的条件限制得“最严”:
丙选择的两个数字之积是24。那么丙除了已经推理说明的选择3、8之外,按道理也可以选择4、6这两个数字。但是选择4、6最终是行不通的。如果选择了4、6,现在剩下1、2、3、5、7、8、9这7个数字让甲乙丁来选择。
在这样的条件下丁的条件是剩余的三个人中限制得“最严”的:丁选择的两个数字之商要是3。丁可以选用3、1或9、3两个数字了。
*************
在选用3、1后剩下2、5、7、8、9这么5个数字了。
现在要求“甲选的两个数字之和必须是10”,甲必须选择2和8。剩下的数字是5、7、9。
由于“乙选择的两个数字之差必须是1”,乙的数字无法选择。所以此路不通。
*************
在选用9、3后剩下1、2、5、7、8这么5个数字了。
现在要求“甲选的两个数字之和必须是10”,甲必须选择2和8。剩下的数字是1、5、7。
由于“乙选择的两个数字之差必须是1”,乙的数字无法选择。所以此路同样不通。
补充二:
笔算解讲究的是逻辑的严密推理,完全靠的是是“智取”。
计算机运算虽然也需要用“智”来编程推理,但是“筛选”不合理答案基本上依靠的是计算机的“算力”——计算机的高速运算能力。不管问题可能的“分岔路”有多少,最终都能得到正确的答案。所以可以算是“力取”。计算机的算力可以帮助我们从纷繁众多的头绪中找出其中最为隐蔽的答案。
LOGO编程GIF动画
用PCLogo编写的正方形递归动画
加载中,请稍候......