【问题标题】:How to find the largest sum and smallest positive difference?如何找到最大的和和最小的正差?
【发布时间】:2013-10-07 20:45:13
【问题描述】:

使用数字 9、8、7、6、5 和 4 各一次,找到以下内容:

a) 最大可能的总和

除了提供最大可能总和的解决方案之外,还有更多的解决方案吗?你怎么知道它是最大可能的总和?

b) 可能的最小(正)差异

是否有不止一种解决方案?你怎么知道这是最小的差异?

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

【问题讨论】:

  • 说真的,你不需要电脑来解决这个问题。尝试发帖到math.stackexchange.com
  • 有时顺序并不重要。例如:975 + 864 = 1839,但也有 964 + 875 = 1839。在这种特殊情况下,由于这两个数字是对称的并且都是 3 位数字,所以重要的是在两个数字之间平均分配最高优先级的数字,并且你已经完成了,至少对于最大的部分。我承认,最小的正差异有点棘手。
  • 这个问题似乎是题外话,因为它是关于数学,而不是软件开发。

标签: algorithm math addition subtraction


【解决方案1】:

嗯,很有趣

区别:

如果你总是把元组(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 的可能性来建立这个总和。

【讨论】:

    【解决方案2】:

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

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

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

      • 第二个数字(没有第一位)必须尽可能大
      • 第一个数字(没有第一位)必须尽可能小
      • 前几位只能相差 1
      • 经过一番思考,您应该得出相同的结果

    【讨论】:

      【解决方案3】:

      由于您要求算法,因此这里是 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)]
      

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-03
        • 2015-05-04
        • 1970-01-01
        • 2015-10-28
        • 1970-01-01
        • 2012-02-10
        相关资源
        最近更新 更多