欧几里德算法(Euclid algorithm)即辗转相除法,一个简单高效优美广为人知的数论式子
关键:恒等式gcd(a,b)=gcd(b,amodb),边界条件 gcd(a,0)=a 一起构成如下程序:
int gcd(int a,int b)
{
return b==0?a:gcd(b,a%b);
}
这里透过欧几里德算法,通过它求最小公倍数,最大公约数,来掌握递归、嵌套,也为更好的利用此类算法
函数的嵌套调用
//自定义函数求两数的最大公约数
int divisor(int a,int b)
{
int temp;//定义整型变量
if(a<b)//通过比较求出两个数中的最大数很最小
{
temp=a;a=b;b=temp;//设中间变量进行两数交换
}
while(b!=0)//通过循环求两书的余数 直余数为0
{
temp=a%b;
a=b;//变量数值交换
b=temp;
}
return(a);//返回最大公约数到调用函数处
}
//自定义函数求两数的最小公倍数
int multiple(int a,int b)
{
int divisor(int a,int b);//自定义函数返回的类型
int temp;
temp=divisor(a,b);//再次调用自定义的函数,求出最大的公约数
return(a*b/temp);//返回最小公倍数到主调函数处进行输出
}
#include<stdio.h>
int main()
{
int m,n,t1,t2;//定义整型变量
scanf("%d%d",&m,&n);
t1=divisor(m,n);
t2=multiple(m,n);//自定义主调函数
printf("hcd is %d\n",t1);//输出最大公约数
printf("lcm is %d\n",t2);//输出最小公倍数
}
函数的递归调用:
// 递归调用时要注意溢出
int gcd(int a,int b)
{
if(a%b==0)
return b;
else
return gcd(b,a%b);
}
#include<stdio.h>
int main()
{
int m,n,t1;
scanf("%d%d",&m,&n);
t1=gcd(m,n);
printf("hcd %d\n",t1);
printf("lcm %d\n",m/t1*n);//先除后乘 防止溢出
}
采用递归调用方法要注意递归终止条件的描述,找到递归变化的规律是关键