如何找到最大和最小的正差?

时间:2013-10-07 20:45:14

标签: algorithm math addition subtraction

分别使用数字9,8,7,6,5和4,找到以下内容:

a)最大可能的总和

是否存在超过解决方案的最大可能总和?你怎么知道它是最大的总和?

b)可能的最小(正)差

是否有多个解决方案?你怎么知道这是最小的差异?

数字必须为3位数。例如,965 + 784或879 - 654

3 个答案:

答案 0 :(得分:3)

嗯很有趣

差:

如果您总是为(a_1,b_1),(a_2,b_2),(a_3,b_3)选择a_1a_2a_3-b_1b_2b_3,则不同之处在于:

100*(a_1-b_1)+10*(a_2-b_2)+(a_1-b_1)

因此,对于最小的差异,我想这应该是满的:-(a_2-b_2) > -(a_3-b_3) > (a_1-b_1)

(a_2-b_2) = 4-9 = -5 = d_2
(a_3-b_3) = 5-8 = -3 = d_3
(a_1-b_1) = 7-6 =  1 = d_1

为您提供唯一最小的745-698 = 47,因为在所有其他变体中d_2会更大,或d_3会更大甚至d_1。 它也是独特的(所以只有一个解决方案),因为它在积极的差异之后被问到,所以你无法切换数字。

总:

所以我们得到了总和:

100*(a_1+b_1) + 10*(a_2+b_2) + (a_2+b_2)

现在:(a_1+b_1)>(a_2+b_2)>(a_3+b_3)

a_1+b_1 = 8+9 = 17
a_2+b_2 = 7+6 = 13
a_3+b_3 = 4+5 = 9

所以它是964+875 = 975+864 = 1839,它不是唯一的,但仍然是最大的。 您可以更改b_ia_i 2^3可能来构建此总和。

答案 1 :(得分:1)

确保尝试所有组合并记住最佳解决方案。但是当你聪明的话,你可以通过以下方式避免它:

  1. 最大总和为975 + 864 = 1839

    • 或将更大数字均匀分配到更高位数的任何组合
    • 就像Shashank Gupta在评论中所写的那样
  2. 最小正差异类似于745 - 698 = 47

    • 第二个数字(没有第一个数字)必须尽可能大
    • 第一个数字(没有第一个数字)必须尽可能小
    • 第一个数字必须仅相差1
    • 经过一番思考后你会得出同样的结果

答案 2 :(得分:1)

由于你要求算法,这里是python中的一个强力解决方案:

In [1]: from itertools import permutations
In [2]: def gen_pairs():
   ...:     for p in permutations('987654'):
   ...:         yield int(''.join(p[:3])), int(''.join(p[3:]))
In [3]: '%i = %i + %i' % max((a+b, a, b) for a,b in gen_pairs())
Out[3]: '1839 = 975 + 864'
In [4]: '%i = %i - %i' % min((a-b, a, b) for a,b in gen_pairs() if a>b)
Out[4]: '47 = 745 - 698'

这只是给出了最小值和最大值。要检查唯一性:

In [4]: [(a,b) for (a,b) in gen_pairs() if a+b == 1839]
Out[4]: 
[(975, 864),
 (974, 865),
 (965, 874),
 (964, 875),
 (875, 964),
 (874, 965),
 (865, 974),
 (864, 975)]

请注意,如果您不计算交换的答案,这些只是4个解决方案。

In [5]: [(a,b) for (a,b) in gen_pairs() if a-b == 47]
Out[6]: [(745, 698)]

所以差异有一个独特的解决方案。

我认为通过逻辑推理解决这个问题更为优雅,如其他人所示。这证明他们是对的。

相关问题