gcd函数常用于应用计算最大公约数(m),最小公倍数(a*b/m)
1.证明欧几里得算法
即证明gcd(a,b)=gcd(b,a%b) (a>b)
设a=kb+r(k=a/b,r=a%b),d|a,d|b
r=a-kb,易得d|r
a,b,r有公约数d,则求a,b公约数相当于求b,r公约数,所得最大公约数m
2.循环算法
#include <stdio.h>
int main(){
int a,b,c;
scanf("%d %d",&a,&b);
while(b!=0){
c=a%b;
a=b;
b=c;
}
printf("%d",a);
return 0;
}
3.递归算法
#include <stdio.h>
#include <math.h>
int gcd(int a,int b){
if(b==0)
return a;
else
gcd(b,a%b);
}
int main(){
int a,b,c;
scanf("%d %d",&a,&b);
c=gcd(a,b);
printf("%d",c);
return 0;
}
4.优化递归
#include <stdio.h>
#include <math.h>
int gcd(int a,int b){
b==0?a:gcd(b,a%b);
}
int main(){
int a,b,c;
scanf("%d %d",&a,&b);
c=gcd(a,b);
printf("%d",c);
return 0;
}