C的GCD功能

时间:2013-11-02 04:20:49

标签: c

问题1.问题5(可分割)我尝试了蛮力方法但是花了一些时间,所以我引用了几个网站并找到了这段代码:

#include<stdio.h>
int gcd(int a, int b)
{
    while (b != 0)
    {
        a %= b;
        a ^= b;
        b ^= a;
        a ^= b;
    }

    return a;
}

int lcm(int a, int b)
{
    return a / gcd(a, b) * b;
}

int main()
{
    int res = 1;
    int i;
    for (i = 2; i <= 20; i++)
    {
        res = lcm(res, i);
    }

    printf("%d\n", res);
    return 0;
}

这很简单,但我不明白函数“gcd”是如何工作的;有人可以帮我理解逻辑。 (我知道它返回2个数字的GCD,但为什么这么多操作呢?)

4 个答案:

答案 0 :(得分:13)

关于第二个问题:GCD功能使用Euclid's Algorithm。它计算A mod B,然后用XOR swap交换A和B.更易读的版本可能如下所示:

int gcd(int a, int b)
{
    int temp;
    while (b != 0)
    {
        temp = a % b;

        a = b;
        b = temp;
    }
    return a;
}

答案 1 :(得分:5)

这个问题也可以通过递归以非常简洁的方式解决:

int gcd(int a, int b) {
    int remainder = a % b;

    if (remainder == 0) {
        return b;
    }

    return gcd(b, remainder);
}

答案 2 :(得分:1)

我为GCD执行了这些声明:

#include<stdio.h>
#include<conio.h>
int main(){
   int l, s,r;

   printf("\n\tEnter value : ");
   scanf("%d %d",&l,&s);

  while(l%s!=0){
    r=l%s;
    l=s;
    s=r;
  }
  printf("\n\tGCD = %d",s);
  getch();
}

答案 3 :(得分:0)

使用一些递归和Objective-C

-(int)euclid:(int)numA numB:(int)numB
{
    if (numB == 0)
        return numA;
    else
        return ([self euclid:numB numB:numA % numB]);
}