#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,但为什么这么多操作呢?)
答案 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]);
}