如何使这种线性时间复杂度变为对数时间复杂度?

How to make this linear time complexity to log time complexity?

我正在练习编码挑战,但遇到了这个问题。

A和他的朋友在整数商店各买了一个数,A有N号,他的朋友有M号。A希望他们的两个数互质。为此,A 将这两个数字除以可以整除这两个数字的最大数字。 A做完这个操作想知道数字的和,帮他求那个和。

输入

Input: 
N = 6, M = 5
Output: 
11
Explanation:
The largest number that can divide both 
5 and 6 is 1. 
After dividing, 5+6 = 11.

我试过这个代码

long sum(long N, long M){
    long divider = 1;
    long min = Math.min(N,M);
    for(long i=2; i<=min; i++)
        if(N%i==0 && M%i==0)
            divider=i;
    return (N/divider) + (M/divider);
}

但预期的 运行 时间复杂度为 O(log(n))。 但是我的代码给出了 O(n).

我找不到任何方法使其对数。请帮助我。

您应该使用任何有效的算法来找到 GCD - 最大公约数。例如。您可以尝试使用 O(log(min(N, M)) 时间复杂度 Euclidean algorithm

public static long sum(long N, long M) {
    long gcd = gcdEuclideanAlgorithm(N, M);
    return (N / gcd) + (M / gcd);
}

private static long gcdEuclideanAlgorithm(long a, long b) {
    return b == 0 ? a : gcdEuclideanAlgorithm(b, a % b);
}

您可以找到更多算法 here