有关如何处理此算法的策略?

时间:2015-02-11 11:54:24

标签: algorithm

我在测试中被问到这个问题,我需要有关如何处理解决方案的帮助,而不是实际答案。问题是

  

您已获得一个7位数字(每个数字不同,0-9)。该号码具有此属性

     

前3位数的乘积=最后3位数的乘积=中央3位数的乘积

识别中间数字。

现在,我可以通过暴力(试错)在纸上做到这一点,产品是72,数字是

  

8,1,9,2,4,3,6

现在我如何以无蛮的方式解决问题?

9 个答案:

答案 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

根据这些关系,我们可以排除057,因为09之间没有其他这些数字的乘数。所以我们留下七个数字,每个答案中包含一个数字。我们将研究如何将数字配对(abdecdfg)。

9会怎样?它不能与36结合使用,因为它们的产品将是因子3的三倍,我们的4因子总数为3 。同样,36必须至少一起组合以响应9这两个因素。这样会得到18的产品,因此9必须至少与2合并一次。

现在,如果9x2位于角落,则3x6必须位于中间位置。在另一个角落的含义必须有另一个乘数3。因此,92位于中间位置。

我们假设ab=3x6(另一种情况是对称的)。然后d必须是92。但如果d9,则fg必须是3的倍数。因此d2e9。我们可以在这里停下来回答中间数字是

  

2

现在我们有2c = fg,其余选项为1, 4, 8。我们发现唯一的解决方案是c = 4, f = 1, g = 8c = 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):

  1. 9 OR 12 2' s AND
  2. 6 3' s
  3. (必须是3的乘积,下限是所有数字的素数因子的总数,上限是下限* 2)

    考虑第2点(因为它有一种可能性),A有2 3&s,并且B和C都相同。为了得到更多的素数因子,我们需要将数字放入两个产品之间的连接数字(第三或第五位)。将素数因子3的数字提取为两组{3,6}和{9},并将数字放入连接数字。 唯一可行的方法是在连接数字中加9,在未连接的产品上加3,6。这意味着xx9xx3636xx9xx(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 N7N1N2N3N3N4N5

的最终解决方案N5N6N7
  1. 0,5和7是要排除的,因为它们是素数,没有其他密码是它们的倍数。因此,如果他们划分了3个数字中的一个,那么没有其他数字可以划分其他数字。

  2. 所以我们得到了剩余的7个密码:1234689 其中密码的乘积为2^7*3^4

  3. (N1*N2*N3)(N5*N6*N7)相等,因此他们的产品是一个正方形数字。然后我们可以从前一点的乘积中删除其中一个数字(N4)以找到一个平方数(即两个数字上的指数

    • N4不能是1, 3, 4, 6, 9
    • 我们得出结论N42 or 8
  4. 如果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个数字和中间位置的困难部分。

    1. 然后,我们知道我们必须在2^3(N1*N2*N3)(N3*N4*N5)上分发(N5*N6*N7),因为2^3*2*2^3=2^7
    2. 我们已经提供了8 to N12 to N4,我们放置了6 to N64 to N5位置,导致3个数字中的每一个都是8的倍数。

      现在,我们有:1st grp: 8XX, 2nd group: X24 3rd group: 46X

      1. 考虑到奇数,我们有相同的思维方式,我们分配3 ^ 2,知道我们在最后一组中已经有6个。 最后一组将获得3.而第一组和第二组将获得9。
      2. 现在,我们有: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

现在我们有819defg918defg ...

对其余数字使用一些计算,我们可以看到只有819defg是可能的,因为我们需要 72/9 = 8 ,因此只有2,4有效,虽然我们无法从2,4,3,6个数字创建 72/8 = 9 ,所以 - &gt; 81924fg81942fg和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);
}

//未经测试的代码