一道小学数学题

还记得小学时做过的数学题吗?记得那时候做过的什么“相遇问题”、“追及问题”、“鸡兔同笼问题”,解决方法是四则运算。后来学会了方程,就把从前的解法全忘了。有一次收拾书柜,翻出一张小学试卷,有一道题目,我只用了两步的四则运算就做出来了,换现在我只会列二元一次方程组来求解。我看着当时的算式发呆,因为怎么也看不懂每一步是什么意思。

有人在统计之都提出了一道小学生的数学题:

请问如何用R编程:A,B,C,D为0到9的整数,
A B C D
    × 9
-----------
D C B A
求 A,B,C,D的值。

看到此帖,我仿佛回到了小学时光里。当时解决这种问题不在话下,现在却是人越来越懒,脑子越来越笨了。能用机器的,就不想思考。有人回复的 R 代码是这样的:

for(i in 1001:9999){
    if(as.character(i) == paste(rev(strsplit(as.character(i*9), NULL)[[1]]), collapse="")){
        print(i)
    }
}

看来简洁,读起来却费劲。事实上,这短短的代码背后藏着很多步骤,换个写法展开后就容易看懂了:

for(i in 1001:9999){ # 穷举,每个数都试一下
    i.char = as.character(i) # 把数i转换成字符串
    j = i * 9 
    j.char = as.character(j) # 把数j转换成字符串
    j.char.array = strsplit(j.char, NULL)[[1]] # 把字符串拆成单个字符
    j.char.array.rev =rev(j.char.array) # 把字符按倒序排列
    j.char.rev = paste(j.char.array.rev, collapse = "") # 把字符合并成字符串

    if(i.char == j.char.rev){ # 判断是否符合题目的条件
        print(i)
    }
}

用的是穷举法,把1001到9999之间的所有数都试了一遍。这是大学生的水平。

另一位网友说:

人脑一小步,电脑一大步。A必然1,D必然9;推得B必然0;推得C必然8。所以是1089。

这才是小学生的水平。

本文发表于“大鹏志”(pzhao.org),2014年01月01日于Bayreuth。

原文链接

comments powered by Disqus