检查整数是否是给定集合中某些元素的GCD

时间:2015-12-26 15:03:00

标签: algorithm math greatest-common-divisor

给定一组正整数和整数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

集合的大小:< = 100000

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

2 个答案:

答案 0 :(得分:2)

1问题与示例不一致:

10,15,18:

  • 3不是10的除数,也不是6
  • 没有共同的除数

2你的问题可以减少:

  • k划分每个元素,所以除以它们=>新的“减少”集合
  • 如果k是某个子集的GCD,则相应的缩减子集有1作为GCD(它们是素数一起)
  • 所以我们可以忘记k

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

但如果从子集开始为真,那么所有元素都是如此。

所以你的算法是好的:拿A1,A2和GCD,然后是这个A3的GCD,......

如果在某个时刻你得到1,那就结束了。

答案 1 :(得分:0)

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;
}