annybaby 发表于 2013-1-8 23:13:13

不错的代码,学习了~~不过楼上众位都是考虑用循环,可是小学生应该没有这么"先进"的解法吧~?

happytc 发表于 2013-1-9 00:08:30

回复 16# annybaby


    小学生的方法,我猜就是我上面给的方法了。
不过,后面部分进一步分析,如当知道数A尾数,也就知道数B的尾数了。接着不用循环这么无赖方法而是用小学生的先进方法:数A尾数乘以4后,得到数B进不进位,若进位了,则数B十位数上是啥,知道了数B十位上的数字后,再由此再得到百位数……,其实也是一种枚举而已。很多奥数题目就是这样分析而来的。

annybaby 发表于 2013-1-9 00:15:06

回复 17# happytc


嗯,十分钟搞定算法+数据结构,真是牛A得不行了,我太崇拜你啦~~

的确,都是先缩小下范围,然后枚举尝试

seeyou 发表于 2013-1-9 19:05:23

写一个传统的方法

Global $count = 0
Global $map
Local $output
local $time=TimerInit()
solution(0, 0, 0)
MsgBox(0,TimerDiff($time),$output &@CRLF&$count)
Func solution($big, $small, $level)
        $count += 1
        If ($small * 4 > $big Or ($small + 3) * 4 < $big) Then Return 0
        If $level == 4 Then
                If $small * 4 == $big Then
                        $output &= $big &" ======> "&$small&@CRLF
                EndIf
                Return 0
        EndIf
        Local $i = 0, $j = 0
        For $i = 2 To 8
                If $level = 0 Then
                        If $i < 4 Then ContinueLoop
                        $map[$i] = 1
                        solution($i, 1, $level + 1)
                        $map[$i] = 0
                Else
                        For $j = 2 To 8
                                If $map[$i] = 0 And$map[$j] = 0 And $i <> $j Then
                                        $map[$i] = 1
                                        $map[$j] = 1
                                        solution($big * 10 + $i, $small * 10 + $j, $level + 1)
                                        $map[$i] = 0
                                        $map[$j] = 0
                                EndIf
                        Next
                EndIf
        Next
        Return 0
EndFunc

vuivui 发表于 2013-1-10 14:34:08

本帖最后由 vuivui 于 2013-1-11 08:13 编辑

我曾为小朋友做过,套出来比较容易的,但是解释起来有点麻烦,类似题目比较多,两头套中间凑做起来比较快。

因为有表格就做成图片了

补充说明:我在图里已说明小数千位为1基本可以定下来,大数个位是2的理由还有小数个位可供选的数字有3、8两个,而大数个位为4小数个位可选数仅为6,1千位已用在千位。大数个位为8,小数的个位也有两个数可选,但概率上为说2、4为高。所以说小数千位为1,大数个位为2是首选,一旦这两个数定下来,中间两个数是很容易的,怎么凑都能凑出来。像这种题目,如果没有编过类似枚举的程序,可能还是直接做快。

zym3138 发表于 2013-1-10 16:57:45

我没看懂他们的代码

seeyou 发表于 2013-1-10 21:57:38

回复 20# vuivui


    还有一个可以优化的地方,大数最后两位一定能被四整除。

vuivui 发表于 2013-1-11 09:42:38

回复vuivui


    还有一个可以优化的地方,大数最后两位一定能被四整除。
seeyou 发表于 2013-1-10 21:57 http://www.autoitx.com/images/common/back.gif


是的,两位以上数如果能被4整除,那么百位以上×100和十个位都能被4整除,理由是:
设两位以上数为“xsg”
xsg/4=(x*100+sg)/4=x*100/4+sg/4
x*100肯定能被4整除
如果xsg能被4整除,必然sg能被4整除

如果4位数“qbgs”能被4整除,那么
qb*100和gs肯定能被4整除
这样推理起来更方便了,就是小学生是否知道这个道理。

proteus 发表于 2013-1-14 12:40:37

本帖最后由 proteus 于 2013-1-14 20:44 编辑

小数称数A,大数称数B
数A介于1234和8765/4之间
数B = 数A * 4
数A和数B合起来8个数字,去重,排序后必须等于“12345678“

用Python 2或Python 3写,一行代码足矣。print([(b,b*4) for b in range(1234,8765//4) if sorted(set(''.join(map(str,(b,b*4))))) == list('12345678')])

流浪的灵魂 发表于 2013-1-14 14:43:01

高手果然很多…………看到这么多代码,,不知不觉就变懒了啊…………

xyhqqaa 发表于 2013-1-14 15:00:38

大神都在..路过膜拜..哈哈

w58850 发表于 2013-1-14 20:51:46

初学AU3, ,看着有点蒙- -
页: 1 [2]
查看完整版本: 据说是小学数学题 大家有思路没?