找回密码
 加入
搜索
楼主: chinafla

[效率算法] 据说是小学数学题 大家有思路没?

 火... [复制链接]
发表于 2013-1-8 23:13:13 | 显示全部楼层
不错的代码,学习了~~不过楼上众位都是考虑用循环,可是小学生应该没有这么"先进"的解法吧~?
发表于 2013-1-9 00:08:30 | 显示全部楼层
回复 16# annybaby


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

评分

参与人数 1金钱 +50 收起 理由
3mile + 50 HAPPY兄数学能力强大

查看全部评分

发表于 2013-1-9 00:15:06 | 显示全部楼层
回复 17# happytc


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

的确,都是先缩小下范围,然后枚举尝试
发表于 2013-1-9 19:05:23 | 显示全部楼层
写一个传统的方法

Global $count = 0
Global $map[9]
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

发表于 2013-1-10 14:34:08 | 显示全部楼层
本帖最后由 vuivui 于 2013-1-11 08:13 编辑

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

因为有表格就做成图片了

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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
发表于 2013-1-10 16:57:45 | 显示全部楼层
我没看懂他们的代码
发表于 2013-1-10 21:57:38 | 显示全部楼层
回复 20# vuivui


    还有一个可以优化的地方,大数最后两位一定能被四整除。
发表于 2013-1-11 09:42:38 | 显示全部楼层
回复  vuivui


    还有一个可以优化的地方,大数最后两位一定能被四整除。
seeyou 发表于 2013-1-10 21:57



是的,两位以上数如果能被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整除
这样推理起来更方便了,就是小学生是否知道这个道理。
发表于 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 | 显示全部楼层
高手果然很多…………看到这么多代码,,不知不觉就变懒了啊…………
发表于 2013-1-14 15:00:38 | 显示全部楼层
大神都在..路过膜拜..哈哈
发表于 2013-1-14 20:51:46 | 显示全部楼层
初学AU3  , ,  看着有点蒙  - -
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-12-23 18:41 , Processed in 0.077023 second(s), 18 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表