给定一组正整数和整数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
,而不是。 :)感谢您的回答,评论和贡献。我在下面投了一个接受的答案。
答案 0 :(得分:2)
1问题与示例不一致:
10,15,18:
2你的问题可以减少:
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;
}