我想知道在执行时间方面最有效的算法,用于查找两个数字之间是否存在任何公因子(1除外)。我想到的唯一方法就是找到两个或更多数字的GCD,有效地检查两个数字是否均匀,然后找到GCD。
答案 0 :(得分:0)
int a = 20, b = 5, GCD = 0;
while (b != 0)
{
GCD = b;
b = a % b;
a = GCD;
}
printf("%d",GCD);
答案 1 :(得分:0)
你可以看一下这篇文章:http://www.mathblog.dk/gcd-faceoff/
我认为没有办法确定方法是否真的“最快”。您所能做的就是比较不同的实现并尝试替代方案......
编辑:顺便说一句:在发布之前,最好先在谷歌上进行快速搜索;找到另一个有趣的链接,有人问同样的问题!:https://cs.stackexchange.com/questions/1447/what-is-most-efficient-for-gcd答案 2 :(得分:0)
以下应该做-有没有一种方法可以优化?
public boolean hasCommonFactor(int x, int y) {
int min = Math.min(x, y);
int max = Math.max(x, y);
for (int i = 2; i <= min; i++) {
if (min % i == 0 && max % i == 0) {
return true;
}
}
return false;
}
答案 3 :(得分:0)
没有两个数字的界限,这个问题毫无意义。我可以想象两种可能的方法:
第一种方法是遵循欧拉算法的最大公因数(GCD)的计算。此过程是众所周知的,并且为GCD提供了合理的时间量(我相信±O(log n)。
第二种方法基于Eratosthenes筛:首先创建该筛,以(2,3,5,7,7,11,13,17,19,...)开头。您需要经过多达±min(sqrt(a)+1,sqrt(b)+1)
个筛子,直到找到一个共同的因数。显然最好是预先装好筛子。
我个人认为最好的方法是两种方法的组合:从预先填充的筛子开始,进一步生成直到特定点为止,如果没有结果,请切换到一般的GCD方法。但是,如何根据要调查的数字的大小定义“确定点”,这才是真正的问题。