【问题标题】:Check if an integer is GCD of some elements in a given set检查一个整数是否是给定集合中某些元素的 GCD
【发布时间】:2015-12-26 15:02:59
【问题描述】:

给定一组正整数和一个整数k集合中的所有元素都可以被k整除。

如何检查k是否是集合中一些元素的最大公约数?

我的想法:对于集合中的每个元素 a[i],我将其除以 k。然后我得到集合中所有元素的 GCD(在我划分后改变了)。如果 GCD 等于 1,则 k 是集合中某些元素的 GCD。

我做了一些测试用例,我看对了。但在线法官不接受。请给我一个想法,或者检查我的算法并修复它。非常感谢。

让我说得更清楚:

例如,a = {10, 15, 18}:

k = 5 是 GCD(10, 15)。答案是true

k = 3 是 GCD(15, 18)。答案是true

k = 1 是 GCD(10,15,18)。答案是true

k = 6 不是任何包含超过 2 个整数的组的 GCD。答案是false

集合大小:

编辑:抱歉举了一个错误的例子。这是我的错误。 k = 3 不是 GCD(10, 18)。但我想你可能知道这是15,对吧。 :) 感谢您的回答、cmets 和贡献。我在下面投了一个接受的答案。

【问题讨论】:

  • @Paulo:实际上,这是我问过here 的另一个问题中的一件小事。所以我只是想检查一下这个想法是否正确。 :)
  • 看看我的代码是否符合你的要求。
  • 我更新了一个例子。请查阅。 :)
  • 好的,现在我看到您需要数组中的任意两个值组。是对的吗?如果是这样,我可以给你另一个答案。
  • "k=3 是 GCD(10, 18)" ??? 3 不是 10 的除数,更不是最大公约数.....

标签: algorithm math greatest-common-divisor


【解决方案1】:

1 问题与示例不一致:

对于 10、15、18:

  • 3 不是 10 的除数,也不是 6
  • 没有公约数

2 你的问题可以这样简化:

  • k 划分每个元素,因此划分它们 => 新的“缩减”集
  • 如果 k 是某个子集的 GCD,则相应的缩减子集的 GCD 为 1(它们是素数)
  • 这样我们就可以忘记 k

3 现在的问题是:给定一个集合,它是否是素数元素的子集(或 1 作为 GCD)?

但如果从子集中为真,则对所有元素都为真。

所以你的算法很好:取 A1、A2 和 GCD,然后是 A3 的 GCD,...

如果在某个时候你得到 1,它就完成了。

【讨论】:

  • 更进一步,在我问这个问题之前,我已经按照你说的做了。但如果这是一个公认的解决方案,我就不必问了。无论如何,我很高兴你同意我的看法。我会更加努力。再次为我在问题中的错误感到抱歉。我已经编辑了。
【解决方案2】:
int gcd(int a, int b) {
  int c;
  while(a != 0) {
     c = a;
     a = b%a;
     b = c;
  }
  return b;
}

bool function(int[] a, int n, int k) {
    int numberOfGCD = 0;
    for(int i = 0; i < n; i++)
        for(int j = i+1; j < n; j++)
            if(gcd(a[i], a[j]) == k) numberOfGCD++;
    return numberOfGCD > 1;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-05-13
    • 1970-01-01
    • 2017-02-05
    • 2012-12-07
    • 1970-01-01
    • 1970-01-01
    • 2014-11-14
    • 1970-01-01
    相关资源
    最近更新 更多