最大公约数
方法一:辗转相除法
思路:欧几里得算法。其证明待学习。
(1)非递归实现
int main(void){
int a,b,e,r;
scanf("%d%d",&a,&b);
if(a<b){
e=b;
b=a;
a=e;
}
while(a%b!=0){
r=a%b;
a=b;
b=r;
}
printf("%d",b);
return 0;
}
(2)递归实现
int GCD(int a,int b){
/*if(a%b==0){
return b;
}
else{
return GCD(b,a%b);
}*/
return a%b==0?b:GCD(b,a%b);
}
int main(void){
int a,b;
scanf("%d%d",&a,&b);
if(a<b){
int e;
e=a;a=b;b=e;
}
printf("%d",GCD(a,b));
return 0;
}
方法二:穷举法
思路:两个数的最大公约数可能取到的最大值是两数之中较小的那个数,所以从较小的数开始尝试,如果是两个数的公约数,则跳出循环输出该数;如果不是两个数的公约数,则继续尝试比该数小1的数,一直尝试到1。
int main(void){
int a,b,i;
scanf("%d%d",&a,&b);
if(a>b){
int e;
e=a;
a=b;
b=e;
}
for(i=a;i>1;i--){
if(a%i==0&&b%i==0){
break;
}
}
printf("%d",i);
return 0;
}
最小公倍数
思路:两数的最小公倍数等于两数相乘后除以其最大公约数所得值。因此核心依然是计算最大公约数,不再赘述。