无心人 发表于 2010-6-17 15:27:38

再来个数字问题

求1,2,3,4,5,6,7,8,9,0的某个排列,
10个数字每个只有且必有1个
如果在排列中加入1到多个乘号,一个等号
被乘号和等号分隔的相邻数字组成整数,且保证得到的乘法结果正确,问

1、是否存在这种等式
2、列出全部的这种等式
===================================
即多个整数组成的连乘式两边有且恰好有1,2,3,4,5,6,7,8,9,0的10个数字,每个数字出现1次

northwolves 发表于 2010-6-17 19:02:50

a*b=c:

Sub Test()
    Dim i&, j&, k&, s$
    For i = 2 To 98
      For j = 10234 \ i To 98765 \ i
            k = i * j
            s = i & "*" & j & "=" & k
            If Len(s) = 12 Then
                For m = 0 To 9
                  If InStr(s, m) = 0 Then Exit For
                Next
                If m = 10 Then Debug.Print s
            End If
      Next j, i
    End Sub

可得到:
3*5694=17082
3*6819=20457
3*6918=20754
3*8169=24507
3*9168=27504
4*3907=15628
4*7039=28156
4*9127=36508
6*5817=34902
7*3094=21658
7*4093=28651
7*9304=65128
7*9403=65821
27*594=16038
36*495=17820
39*402=15678
45*396=17820
46*715=32890
52*367=19084
54*297=16038
63*927=58401
78*345=26910

056254628 发表于 2010-6-17 19:19:22

如果只有一个乘号,就是以下的形式:
a*b=c
那么必有a mod 3=0 且 b mod 3=0,或 a mod 3=1 且 b mod 3=1。
更严格一点:
(a mod 9) * (b mod 9)只有以下形式
0*0
1*4
3*6
4*1
6*3
7*7

056254628 发表于 2010-6-17 19:35:43

对于乘号不限制,我有个想法:
如果等号右边不存在乘号。那么设等号右边的数为S,
那么S的位数必定是4位数或5位数。
可以穷举所有的S,对S进行因数分解,所分解成的若干个因数加上S本身,刚好满足题目的要求就是一解。
-------------------------------------------
对于等号两边都有乘号的:
那么两边乘积的结果设为S,那么S必定是3位数、4位数或5位数
可以对S进行因数分解,两种因数分解的结果刚好遍及所有的10个数,那么就是1解。

northwolves 发表于 2010-6-17 21:31:32

一共找到59个解:

4830=1×2×5×7×69
6970=1×2×3485
7056=1×3×24×98
7056=1×3×8×294
7096=1×2×3548
7290=1×3×5×486
7690=1×2×3845
7830=1×6×29×45
8370=1×2×9×465
8596=2×14×307
8652=1×4×7×309
8790=2×3×1465
8970=1×26×345
9076=1×2×4538
9360=1×5×24×78
9360=2×4×15×78
9370=1×2×4685
9380=2×5×14×67
9670=1×2×4835
9706=1×2×4853
9720=1×3×5×648
9730=1×2×4865
9870=2×3×1645
10752=3×4×896
12780=4×5×639
14760=5×9×328
14820=5×39×76
15628=4×3907
16038=27×594
16038=54×297
16704=9×32×58
17082=3×5694
17820=36×495
17820=45×396
17920=8×35×64
18720=4×5×936
19240=8×37×65
20457=3×6819
20574=6×9×381
20754=3×6918
24056=8×31×97
24507=3×8169
25803=9×47×61
26180=4×7×935
27504=3×9168
28156=4×7039
28651=7×4093
30296=7×8×541
30576=8×42×91
30752=4×8×961
31920=5×76×84
32760=8×45×91
32890=46×715
34902=6×5817
36508=4×9127
47320=8×65×91
65128=7×9304
65821=7×9403
58401=63×927

qianyb 发表于 2010-6-18 13:38:49

不止59个解吧,起码少了四个
7*3094=21658
39*402=15678
52*367=19084
78*345=26910

qianyb 发表于 2010-6-18 14:06:16

3*5694=17082
3*6819=20457
3*6918=20754
3*8169=24507
3*9168=27504
4*3907=15628
4*7039=28156
4*9127=36508
6*5817=34902
7*3094=21658
7*4093=28651
7*9304=65128
7*9403=65821
27*594=16038
36*495=17820
39*402=15678
45*396=17820
46*715=32890
52*367=19084
54*297=16038
63*927=58401
78*345=26910

1*2*3485=6970
1*2*3548=7096
1*2*3845=7690
1*2*4538=9076
1*2*4685=9370
1*2*4835=9670
1*2*4853=9706
1*2*4865=9730
1*26*345=8970
2*3*1465=8790
2*3*1645=9870
2*14*307=8596
3*4*896=10752
4*5*639=12780
4*5*936=18720
4*7*935=26180
4*8*961=30752
5*9*328=14760
5*39*76=14820
5*76*84=31920
6*9*381=20574
7*8*541=30296
8*31*97=24056
8*35*64=17920
8*37*65=19240
8*42*91=30576
8*45*91=32760
8*65*91=47320
9*32*58=16704
9*47*61=25803

1*2*9*465=8370
1*3*5*486=7290
1*3*5*648=9720
1*3*8*294=7056
1*3*24*98=7056
1*4*7*309=8652
1*5*24*78=9360
1*6*29*45=7830
2*4*15*78=9360
2*5*14*67=9380

1*2*5*7*69=4830
共63个

northwolves 发表于 2010-6-18 19:18:09

不止59个解吧,起码少了四个
7*3094=21658
39*402=15678
52*367=19084
78*345=26910
qianyb 发表于 2010-6-18 13:38 http://bbs.emath.ac.cn/images/common/back.gif
检查发现我在2楼也贴出这几组了。郁闷。有没有快速的计算方法?

qianyb 发表于 2010-6-19 07:47:05

呵呵,可能是你后来程序改错了
我本来只计算了一个乘号的,发现有22组,跟你的不一样,就全部计算了一次
我是先确定有那几种组合可以成立式子,然后再计算的,如一个乘号时,只有口X口口口口=口口口口口,口口X口口口=口口口口口成立,这样代码多一些,速度应该快一些了

mathe 发表于 2010-6-19 15:04:50

无心人这个题目我们可以通过动态规划将所有子集合能够产生的数据集计算出来,然后对于两个互补的子集合,如果它们对应的数据集有交集,那么就对应一个解。
比如对于每个单数据,它们对应的数据集就数据本身(0可以不用考虑)
然后对于两个数据的集合,比如{2,3},它们对应的数据集包含{23,32,6}
类似的,对于k个数字产生的数据集,首先需要包含这k个数排序产生的数字,然后在包含将这k个数据划分成两个子集合,将它们对应的数据集的数据的乘积也包含在里面。
通过这种方法,可以将所有的1024个数据集都计算出来。
不过产生的总数据量会有点大,内存不一定保存的下,最好将中间数据保存在外部文件中
页: [1] 2
查看完整版本: 再来个数字问题