最短的方法,用于查找两个数字之间是否存在共同因子

时间:2014-01-31 13:03:05

标签: c

我想知道在执行时间方面最有效的算法,用于查找两个数字之间是否存在任何公因子(1除外)。我想到的唯一方法就是找到两个或更多数字的GCD,有效地检查两个数字是否均匀,然后找到GCD。

4 个答案:

答案 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方法。但是,如何根据要调查的数字的大小定义“确定点”,这才是真正的问题。