2

我想找到两个数字的 GCD,但不使用除法或 mod 运算符。一种明显的方法是编写自己的 mod 函数,如下所示:

enter code here
int mod(int a, int b)
{
   while(a>b)
       a-=b;

return a;
}

然后在euclid算法中使用这个函数。还有什么办法吗??

4

4 回答 4

14

您可以预先使用基于减法的欧几里得算法版本:

function gcd(a, b)
    if a = 0
       return b
    while b ≠ 0
        if a > b
           a := a − b
        else
           b := b − a
    return a
于 2012-12-04T18:43:09.160 回答
9

您正在寻找的是二进制 GCD 算法:

public class BinaryGCD {

    public static int gcd(int p, int q) {
        if (q == 0) return p;
        if (p == 0) return q;

        // p and q even
        if ((p & 1) == 0 && (q & 1) == 0) return gcd(p >> 1, q >> 1) << 1;

        // p is even, q is odd
        else if ((p & 1) == 0) return gcd(p >> 1, q);

        // p is odd, q is even
        else if ((q & 1) == 0) return gcd(p, q >> 1);

        // p and q odd, p >= q
        else if (p >= q) return gcd((p-q) >> 1, q);

        // p and q odd, p < q
        else return gcd(p, (q-p) >> 1);
    }

    public static void main(String[] args) {
        int p = Integer.parseInt(args[0]);
        int q = Integer.parseInt(args[1]);
        System.out.println("gcd(" + p + ", " + q + ") = " + gcd(p, q));
    }
}

来源:http ://en.wikipedia.org/wiki/Binary_GCD_algorithm

于 2012-12-04T18:39:33.117 回答
0

使用减法的递归 GCD 计算:

int GCD(int a, int b)
{
    int gcd = 0;
    if(a < 0)
    {
        a = -a;
    }
    if(b < 0)
    {
        b = -b;
    }
    if (a == b)
    {
        gcd = a;
        return gcd;
    }
    else if (a > b)
    {
        return GCD(a-b,b);
    }
    else
    {
        return GCD(a,b-a);
    }
}

来源:链接

于 2012-12-04T18:47:37.830 回答
-1

一个或多或少直接的方法是下面的代码,它源自 Pick 定理:

int gcd(int a, int b)
{

     if( a < 0)
     {
         a = -a;
     }

     if( b < 0)
     {
         b = -b;
     }

     if( a == b)
     {
          return a;
     }

     //swap the values to make the upper bound in the next loop minimal
     if( a > b)
     {
        int swap = a;
        a = b;
        b = swap;
     }
     

     int temp=0;

     for(int i=1; i<=a; i++)
     {
          temp += math.floor(b*i/a);
     }

     return (a*b + b - a + temp)/2;
}
于 2020-12-30T16:10:53.757 回答