我在测试中被问到这个问题,我需要有关如何处理解决方案的帮助,而不是实际答案。问题是
您已获得一个7位数字(每个数字不同,0-9)。该号码具有此属性
前3位数的乘积=最后3位数的乘积=中央3位数的乘积
识别中间数字。
现在,我可以通过暴力(试错)在纸上做到这一点,产品是72,数字是
8,1,9,2,4,3,6
现在我如何以无蛮的方式解决问题?
答案 0 :(得分:4)
让数字为: a b c d e f g
按照规则(1):
axbxc = cxdxe = exfxg
更多我们有(2):
axb = dxe和 cxd = fxg
这个问题可以通过因子分解和一点点击中/试验来解决。 从1到9的数字中,5和7可以直接拒绝,因为它们是素数,不适合上述两个方程。
数字1到9可以理解为:
1 = 1,2 = 2,3 = 3,4 = 2X2,6 = 2X3,8 = 2X2X2,9 = 3X3
在分解后,我们现在剩下总共7 - 2,4 - 3和数字1。 至于规则2,我们只剩下4种可能性,这4个方程式可以通过因子分解逻辑计算,因为我们知道我们总共有7 2和4 3个。
1:1×8(2×2×2)= 2×4(2×2)
2:1X6(3x2)= 3X2
3:4(2×2)X3 = 6(3×2)X2
4:9(3×3)X2 = 6(3×2)X3
跳过5和7我们剩下7位数。 使用上面的方程式,我们有4位数字,剩下3位数,可以通过命中和试验进行测试。例如,如果我们考虑第一种情况:
1X8 = 2X4并留下3,6,9。 我们有axbxc = cxdxe我们可以选择这3个选项,在这种情况下,产品将是24,48和72.
24无法正确,因为我们留下的最后三位数字是6,9,4(= 216)
48不能正确,因为对于最后三位数字,我们留下3,9,4(= 108)
72可能是一个有效的选项,因为在这种情况下最后三位数将是3,6,4(= 72)
答案 1 :(得分:1)
使用关系编程可以解决这个问题。我认为很清楚地让程序员看到了发生了什么以及问题是如何解决的。虽然它可能不是解决问题的最有效方法,但它仍然可以带来所需的清晰度并处理一定大小的问题。考虑一下Oz的这个小例子:
fun {FindDigits}
D1 = {Digit}
D2 = {Digit}
D3 = {Digit}
D4 = {Digit}
D5 = {Digit}
D6 = {Digit}
D7 = {Digit}
L = [D1 D2 D3] M = [D3 D4 D5] E= [D5 D6 D7] TotL in
TotL = [D1 D2 D3 D4 D5 D6 D7]
{Unique TotL} = true
{ProductList L} = {ProductList M} = {ProductList E}
TotL
end
(现在可以进一步参数化,但非优化以说明这一点)。
在这里,您首先选择7位数字,功能为数字/ 0。然后你创建三个列表,L,M和E组成的段,以及要返回的总列表(你也可以返回连接,但我发现这更好用于说明)。
然后是重点,你指定必须完整的关系。首先,TotL是独一无二的(在您的任务措辞中有所不同)。然后是下一个,即分段产品必须相等。
现在发生的是搜索您的答案。这是一种深度优先的搜索策略,但也可以是广度优先的,并且需要一个解算器来展示所有解决方案。搜索策略位于SolveAll / 1函数内。
{Browse {SolveAll FindDigits}}
这又返回了这个答案列表:
[[1 8 9 2 4 3 6] [1 8 9 2 4 6 3] [3 6 4 2 9 1 8]
[3 6 4 2 9 8 1] [6 3 4 2 9 1 8] [6 3 4 2 9 8 1]
[8 1 9 2 4 3 6] [8 1 9 2 4 6 3]]
至少这种方式不是使用蛮力。基本上你在这里寻找答案。可能有启发式方法可以让您更快找到正确答案(也许是一些数学魔法),或者您可以使用遗传算法搜索空间或其他众所周知的策略。
答案 2 :(得分:1)
我的回答实际上扩展了@ Ansh的答案。
让abcdefg
为数字的数字。然后
ab=de
cd=fg
根据这些关系,我们可以排除0
,5
和7
,因为0
和9
之间没有其他这些数字的乘数。所以我们留下七个数字,每个答案中包含一个数字。我们将研究如何将数字配对(ab
,de
,cd
,fg
)。
9
会怎样?它不能与3
或6
结合使用,因为它们的产品将是因子3
的三倍,我们的4
因子总数为3
。同样,3
和6
必须至少一起组合以响应9
这两个因素。这样会得到18
的产品,因此9
必须至少与2
合并一次。
现在,如果9x2
位于角落,则3x6
必须位于中间位置。在另一个角落的含义必须有另一个乘数3
。因此,9
和2
位于中间位置。
我们假设ab=3x6
(另一种情况是对称的)。然后d
必须是9
或2
。但如果d
为9
,则f
或g
必须是3
的倍数。因此d
为2
而e
为9
。我们可以在这里停下来回答中间数字是
2
现在我们有2c
= fg
,其余选项为1, 4, 8
。我们发现唯一的解决方案是c = 4, f = 1, g = 8
和c = 4, f = 8, g = 1
。
因此,如果3x6
位于左下角,我们有以下解决方案:
3642918,3642981,6342918,6342981
如果3x6
位于右上角,我们提供以下与上述相反的解决方案:
8192463,1892463,8192436,1892436
答案 3 :(得分:1)
不同数字的主要因素(如果可能)
0 = 0
1 = 1
2 = 2
3 = 3
4 = 2 x 2
5 = 5
6 = 2 x 3
7 = 7
8 = 2 x 2 x 2
9 = 3 x 3
总计:
7 2
' s + 4 3
' s + 1 5
' s + 1 7
'
由于 When A=B=C, composition of prime factor of A must be same as composition of prime factor of B and that of C
,0 , 5 and 7
被排除在外,因为它们具有永远无法与事实相匹配的唯一素因子。
因此,剩下7个2
' s + 3
,我们有7个数字(1,2,3,4,6,8,9) 。由于只有7位数字,因此数字仅由这些数字组成。
回想一下,A,B和C必须具有相同的素因子组成。这意味着A,B和C在其组成中具有相同数量的2
&{39}和3
。所以,我们应该尝试实现(总共A和B和C):
2
' s AND 3
' s (必须是3的乘积,下限是所有数字的素数因子的总数,上限是下限* 2)
考虑第2点(因为它有一种可能性),A有2 3
&s,并且B和C都相同。为了得到更多的素数因子,我们需要将数字放入两个产品之间的连接数字(第三或第五位)。将素数因子3
的数字提取为两组{3,6}和{9},并将数字放入连接数字。 唯一可行的方法是在连接数字中加9,在未连接的产品上加3,6。这意味着xx9xx36
或36xx9xx
(3,6的顺序并不重要)< / p>
有了这个结果,我们得到9 x middle x connection digit = connection digit x 3 x 6
。因此,middle = (3 x 6) / 9 = 2
答案 4 :(得分:1)
以下是您可以考虑问题的方法:
让我们注意3个数字N1 N2 N3 N4 N5 N6 N7
,N1N2N3
和N3N4N5
N5N6N7
0,5和7是要排除的,因为它们是素数,没有其他密码是它们的倍数。因此,如果他们划分了3个数字中的一个,那么没有其他数字可以划分其他数字。
所以我们得到了剩余的7个密码:1234689
其中密码的乘积为2^7*3^4
(N1*N2*N3)
和(N5*N6*N7)
相等,因此他们的产品是一个正方形数字。然后我们可以从前一点的乘积中删除其中一个数字(N4
)以找到一个平方数(即两个数字上的指数)
N4
不能是1, 3, 4, 6, 9
。N4
是2 or 8
如果N4为8并且它除(N3*N4*N5)
,我们就无法使用剩余的偶数(2, 4, 6)
来划分
(N1*N2*N3)
和(N6*N7*N8)
都是8. 所以N4是2 ,8不属于第二组(让我们把它放在N1
中)。
现在,我们有:1st grp: 8XX, 2nd group: X2X 3rd group: XXX
注意:此时我们知道产品是72,因为它是2 ^ 3 * 3 ^ 2(2 ^ 6 * 3 ^ 4的平方根),但结果并不重要。我们已经知道7个数字和中间位置的困难部分。
2^3
,(N1*N2*N3)
,(N3*N4*N5)
上分发(N5*N6*N7)
,因为2^3*2*2^3=2^7
我们已经提供了8 to N1
,2 to N4
,我们放置了6 to N6
和4 to N5
位置,导致3个数字中的每一个都是8的倍数。
现在,我们有:1st grp: 8XX, 2nd group: X24 3rd group: 46X
现在,我们有:1st grp: 8X9, 2nd group: 924 3rd group: 463
然后是1 at N2
,这是剩下的位置。
答案 5 :(得分:0)
如果仔细查看数字72,这个问题就很容易了。
我们的号码为abcdefg
和abc = cde = efg
,带有数字8,1,9,2,4,3,6
首先,我们可以得出结论:8,1,9
必须是三元组中的一个,因为1
无法与其他两个数字一起形成72。
我们还可以得出结论:1
必须位于三联的start/end of the whole number or middle
。
现在我们有819defg
或918defg
...
对其余数字使用一些计算,我们可以看到只有819defg
是可能的,因为我们需要 72/9 = 8 ,因此只有2,4有效,虽然我们无法从2,4,3,6
个数字创建 72/8 = 9 ,所以 - &gt; 81924fg
或81942fg
和819必须是开始或结束我们号码的三倍。
所以剩下的工作很简单,我们需要72/4 = 18或72/2 = 36,现在,我们可以得到答案:8192436或8192463.
答案 6 :(得分:0)
7位数:8,1,9,2,4,3,6
说 X x Y x Z = 72
1)从7位数以上挑选任意两位。说X,Y
2)将72除以X然后Y ..你将得到第3个数字,即Z。
我们发现 XYZ 一组3位数字,结果为72。
现在重复1)和2)剩余的4位数。
这次我们发现 ABC 乘以72。
我们可以说,剩下的第7位是我。
3)将72除以I.结果 R
4)将R除以XYZ之一。检查结果是否在ABC中。
如果否,重复步骤3)
如果是,则找到第三对。(假设您将R除以Y,结果为B)
YIB是第三对。
所以...解决方案将是。
XZYIBAC
答案 7 :(得分:0)
你有7个号码 - 而不是以3个为一组来查看它,因此将数字分开:
AB | C | D | E | FG
获取 AB 的值并使用它来获取 C 的值,如下所示: C = ABC / AB
接下来,你想用尾随的2位数做同样的事情,使用 FG 找到 E 。 E = EFG / FG
现在您已经 C &amp; E 您可以解决 D
由于 CDE = ABC ,然后 D = ABC / CE
记住你的公式 - 而不是查看数字创建一个公式,也就是你知道每次都能运作的算法。
ABC = CDE = EFG 但是,您必须记住 = 标志必须平衡。您可以看到 D = ABC / CE = EFG / CE 一旦您知道,您就可以找出解决问题所需的内容。
在代码的小提琴中做了一个简单的例子: http://jsfiddle.net/4ykxx9ve/1/
var findMidNum = function() {
var num = [8, 1, 9, 2, 4, 3, 6];
var ab = num[0] * num[1];
var fg = num[5] * num[6];
var abc = num[0] * num[1] * num[2];
var cde = num[2] * num[3] * num[4];
var efg = num[4] * num[5] * num[6];
var c = abc/ab;
var e = efg/fg;
var ce = c * e
var d = abc/ce;
console.log(d); //2
}();
答案 8 :(得分:0)
您已获得一个7位数字(每个数字不同,0-9)。该号码具有此属性
前3位数的乘积=后3位数的乘积=中央3位数的乘积 确定中间数字。
现在,我可以通过暴力(试错)在纸上做到这一点,产品是72,数字是
8,1,9,2,4,3,6 现在,我该如何以无蛮的方式解决问题?
使用linq和substring函数
示例var item = array.Skip(3)。以一种循环方式获取(3)
for(f =0;f<charlen.length;f++){
var xItemSum = charlen[f].Skip(f).Take(f).Sum(f => f.Value);
}
//未经测试的代码