小学生的方法,我猜就是我上面给的方法了。
不过,后面部分进一步分析,如当知道数A尾数,也就知道数B的尾数了。接着不用循环这么无赖方法而是用小学生的先进方法:数A尾数乘以4后,得到数B进不进位,若进位了,则数B十位数上是啥,知道了数B十位上的数字后,再由此再得到百位数……,其实也是一种枚举而已。很多奥数题目就是这样分析而来的。 回复 17# happytc
嗯,十分钟搞定算法+数据结构,真是牛A得不行了,我太崇拜你啦~~
的确,都是先缩小下范围,然后枚举尝试 写一个传统的方法
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-11 08:13 编辑
我曾为小朋友做过,套出来比较容易的,但是解释起来有点麻烦,类似题目比较多,两头套中间凑做起来比较快。
因为有表格就做成图片了
补充说明:我在图里已说明小数千位为1基本可以定下来,大数个位是2的理由还有小数个位可供选的数字有3、8两个,而大数个位为4小数个位可选数仅为6,1千位已用在千位。大数个位为8,小数的个位也有两个数可选,但概率上为说2、4为高。所以说小数千位为1,大数个位为2是首选,一旦这两个数定下来,中间两个数是很容易的,怎么凑都能凑出来。像这种题目,如果没有编过类似枚举的程序,可能还是直接做快。 我没看懂他们的代码 回复 20# vuivui
还有一个可以优化的地方,大数最后两位一定能被四整除。 回复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 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')]) 高手果然很多…………看到这么多代码,,不知不觉就变懒了啊………… 大神都在..路过膜拜..哈哈 初学AU3, ,看着有点蒙- -
页:
1
[2]