【问题标题】:Computing LCM of M consecutive numbers in an array of N integers计算 N 个整数数组中 M 个连续数的 LCM
【发布时间】:2012-03-22 15:38:35
【问题描述】:

我遇到了这个问题here。这是今年早些时候举行的编程比赛。
总结如下:
给定一个包含 N 个整数的数组,找出所有连续 M 个整数的 LCM。
例如

Array = [3,5,6,4,8] (hence N = 5)  
M = 3  

输出:

LCM(3,5,6) = 30  
LCM(5,6,4) = 60  
LCM(6,4,8) = 24

实际上有一个解决方案草图here,但我无法理解动态编程部分。
因此,如果有人可以通过一些示例详细说明相同的解决方案,那就太好了。
一个新的、易于理解的解决方案也将受到赞赏。

【问题讨论】:

  • 该草图似乎包含三个部分:1)一种方法,2)以“另一种方法将分解每个 A[i]...”开头的部分,以及 3)最后一部分,“许多参赛者使用的另一种方法是……”。您需要哪些方面的帮助?
  • @Beta 我需要动态编程部分的帮助。
  • @Carl 我能想到最简单的解决方案,即在不使用 DP 或任何其他快捷方式的情况下找到所有连续 M 数字的 LCM。这是 O(MN) 时间。

标签: arrays math lcm


【解决方案1】:

我无法再访问该解决方案(也许链接已损坏?),但我会这样做: 我会让我的程序像金字塔一样工作。在最低行,我将拥有具有给定数字的数组。在上面的每一行上,我都会有一个比下面的数组少一个字段的数组。它将存储下面数组中两个值的 LCM。

[   30    ]
[ 15,  30 ]
[3,  5,  6]

通过这种方式,您可以使用递归函数,并且必须构建金字塔的 M-1 层。这是一个伪代码实现:

rekursivePyramid (Integer[] numbers, Integer height) {
    if (height == 0) return numbers;
    else {
        newNumbers = Integer[numbers.size() - 1];
        for (i=0; i<newNumbers.size(); i++) {
            newNumbers[i] = LCM ( numbers[i], numbers[i+1]);
        }
        return rekursivePyramid( newNumbers, height-1);
    }
}

这将为您提供一个数组,您可以在其中找到第一个字段中前 M 个数字的 LCM,第二个字段中从第二个到第 M+1 个数字的 LCM,等等。

【讨论】:

    猜你喜欢
    • 2012-10-18
    • 2014-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-01
    • 2021-09-19
    相关资源
    最近更新 更多