
本文于2023年7月5日首发于本人同名公众号:Excel活学活用,更多文章案例请搜索关注!
☆本期内容概要☆
VBA 解小学三年级数学题
大家好,我是冷水泡茶,昨天晚上辅导三年级小朋友数学,有这样一道题:

我抓耳挠腮地看了半天,愣是没搞明白,只好承认自己不会,“这道题有点复杂,爸爸暂时也想不出解法,让我再考虑考虑......"
今天早上出门前,灵光一闪,是不是可以用VBA来解决?我一个一个数字试,总能把它解出来吧?于是拿出手机把题目拍下来,准备到单位再尝试一下。
于是,我根据题目的已知条件,写了一段代码,总算把ABCDEF给求出来了:
Sub ABCDEF() Dim A%, B%, C%, D%, E%, F% Dim selectedNumber As String Dim r1$, r2$, r3$ For A = 1 To 9 For B = 1 To 9 If A <> B Then r1 = CStr(A * 11 * B * 11) If Len(r1) = 4 Then If Left(r1, 1) = Right(r1, 1) Then C = Left(r1, 1) If C <> A And C <> B Then If Mid(r1, 2, 1) = A And _ Mid(r1, 3, 1) = A Then selectedNumber = A & "|" & B & "|" & C Debug.Print selectedNumber r2 = CStr(B * 11 * B * 11) If Left(r2, 1) = A And _ Mid(r2, 2, 1) = A Then F = Right(r2, 1) If F = Mid(r2, 3, 1) And _ F <> A And F <> B And F <> C Then selectedNumber = A & "|" & B & "|" & C & "|" & F Debug.Print selectedNumber For D = 1 To 9 If InStr(selectedNumber, D) = 0 Then For E = 1 To 9 If InStr(selectedNumber, E) = 0 Then r3 = CStr(D * 11 * E * 11) If Left(r3, 1) = D And Right(r3, 1) = D _ And Mid(r3, 2, 1) = F And Mid(r3, 3, 1) = F Then selectedNumber = A & _ "|" & B & "|" & C & "|" & D & "|" & E & "|" & F Debug.Print selectedNumber Cells(2, 1) = A: Cells(2, 2) = B: Cells(2, 3) = C Cells(2, 4) = D: Cells(2, 5) = E: Cells(2, 6) = F End If End If Next End If Next End If End If End If End If End If End If End If Next NextEnd Sub
上面的代码块看上去不完整,我们再上一张图:

代码解析:
1、通过两层循环,模拟乘数和被乘数
2、对乘积进行考察,判断其各位数字的模式:
(1)长度为4位
(2)首尾相同、中间两位相同、一二位相同、三四位相同
(3)包含乘数或被乘数中的数字
3、把符合条件的数字存到字符串变量selectedNumber里,在后续判断里作为排除项(因为各个字母代表不同的数字)
4、最后得出结果,写入单元格,这里结果只有一条,所有写入单元格的方法就简单处理,没考虑多条符合条件的结果。
结果是解出来了,但三年级小朋友也不可能象我这样写个代码吧?(也许有,但就他们这个阶段的大多数人来说,肯定是用他们自己的思维方式与解题思路。)
通过观察代码解题结果,我们发现,ABCDEF代表6个不同的数字,1~9的数字中,1~3没有出现在答案中,那么,解题思路可能就是要采用排除法。
1、我们发现,积都是4位数。如果两个两位数比较小的话,它的积可能是3位数。
2、我们就从1开始排除,如果能排除掉3个数,根据题意,那么余下的6个数字那就分别对应ABCDEF,而题目并没有要求分别求出每个字母代表的数字,只是要求它们的和,那么把这6个数相加就得出答案。
3、下面我们就试着用排除法来解,做一回小学生:
(一式):AA*BB=CAAC
(二式):DD*EE=DFFD
(三式):BB*BB=AAFF
求:A+B+C+D+E+F
(1)如果A=1,则令B=2~9,而11*88=968,只有3位数,所以2~8排除,11*99=1089,不符合CAAC的数字规则。所以,A<>1,同理,B、D、E均<>1。
再看C,如果C=1,那么2~9中,不同的数字相乘,结尾等于1的只有33*77,但它的首位不等于1,所以C<>1;
再看F,根据三式,如果F=1,那么,B只能是9,则99*99=9801,也不符合数字规则,所以F<>1,结论:所有字母均不等于1。
(2)如果A=2,则令B=3~9,这里有点麻烦了,我不知道有什么规律(也许有,但我不知道),那就一个个地去乘吧:22*33~99,如下表

可见,没有符合CAAC或DFFD的模式的数字,根据一式和二式,可以断定ABDE都<>2。
再看C,如果C=2,那么A*B的尾数为2,则3~9中,不同的数字相乘尾数是2的有:33*44,44*88,66*77,88*99,这些数字乘积首位数字没有等于2的,所以C<>2。
再看F,如果F=2,根据三式,那么3~9中,各个数字与自身相乘,尾数没有等于2的,所以F<>2,结论:所有字母均不等于2。
(3)如果A=3,则令B=4~9,参照(2)的方法:33*44~99

可见,没有符合CAAC或DFFD的模式的数字,所以ABDE都<>3。
再看C,如果C=3,那么A*B的尾数为3,则4~9中,不同的数字相乘尾数是3的只有77*99,乘积首位数字不等于3,所以C<>3。
再看F,如果F=3,根据三式,那么4~9中,各个数字与自身相乘,尾数没有等于3的,所以F<>3,结论:所有字母均不等于3。
总结论:1~9的数字中,剔除了1~3,那么,根据题意,ABCDEF这6个字母应该分别对应着4~9这6个数字中的某个数字,所以A+B+C+D+E+F的和计算如下:
4+5+6+7+8+9=39
至此,似乎问题已经解决,但还是有点意犹未尽,试想我们可不可以进一步求得每个字母的值?接下来:
(4)如果A=4,则令B=5~9,参照(2)的方法:44*55~99

可见,没有符合CAAC或DFFD的模式的数字,所以ABDE都<>4。
再看C,如果C=4,那么A*B的尾数为4,则5~9中,不同的数字相乘尾数是4的有:66*99,乘积首位数字不等于4,所以C<>4。
所以,F=4,根据三式,5~9中,与自身相乘,尾数等于4的,只有8,所以B=8;因88*88=7744,根据三式可知A=7;因77*88=6776,根据一式可知C=6。
至此,尚有D、E对应5或者9,若D=5,则E=9,根据二式55*99=5445,符合条件;若D=9,则E=5,根据二式99*55=5445,不符合条件,因此D=5,E=9。
终极结论:A=7,B=8,C=6,D=5,E=9,F=4,它们的和是39。
上面的解题过程可能也不适合小朋友,计算量太大。而且是知道答案以后,才去倒推解题过程,感觉不是那么严谨。如果哪位朋友有好的解法,欢迎在评论区留言,谢谢!
好,今天就到这吧。欢迎点赞、留言、分享,谢谢大家,我们下期再会。