8

Q 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

4 回答 4

15

对于您的第二个问题: GCD 函数使用Euclid's Algorithm。它计算A mod B,然后用XOR 交换交换 A 和B。更具可读性的版本可能如下所示:

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

        a = b;
        b = temp;
    }
    return a;
}
于 2013-11-02T04:33:02.763 回答
6

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

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

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

    return gcd(b, remainder);
}
于 2016-01-09T08:30:30.723 回答
0

我为 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();
}
于 2017-08-01T09:32:54.820 回答
-2

使用一点递归和 Objective-C

-(int)euclid:(int)numA numB:(int)numB
{
    if (numB == 0)
        return numA;
    else
        return ([self euclid:numB numB:numA % numB]);
}
于 2018-07-18T15:28:15.057 回答