最大公约数最小公倍数的求解是我们初学者常遇见的问题,因此特意整理这四种求法。我认为函数的递归和辗转相除法可以较好的锻炼我们思维和加深函数递归知识。
枚举法
这中算法其实理解起来还是相对简单的就是两个数都进行整除两个数最小的,直到两个数整除到同时能被整除,此时的数就是最大公约数。
if(a%num==0&&b%num==0)
{
return num;
}
注意知识点
这里要让num进行递减,还有注意返回值。源码如下
#include
// 枚举法
int fun(int a,int b)
{
int num;
if(a==0||a==b)
return b;
else if(b==0||a==b)
return a;
//判断a b值得的大小
num=a>b?b:a;
while(num>1)
{
if(a%num==0&&b%num==0)
{
return num;
}
num--;
}
return num;
}
int main()
{
int a,b,num,p;
printf("请输入两个数:");
scanf("%d%d",&a,&b);
//公式法求最小公倍数
p=a*b;
num=fun(a,b);
printf("最大公约数为:%d\n最小公倍数:%d",num,p/num);
return 0;
}
相减法
相减法相较于枚举法,更加的高效,但是基本逻辑思维没有改变许多,通过两个数进行相减并再次赋值给原数,直到a等于b时得出最大公约数。
#include
// 相减法
int fun(int a,int b)
{
int num;
if(a==0||a==b)
return b;
else if(b==0||a==b)
return a;
//判断a b值得的大小
while(a!=b)
{
num=a>b?(a-=b):(b-=a);
}
return num;
}
int main()
{
int a,b,num,p;
printf("请输入两个数:");
scanf("%d%d",&a,&b);
//公式法求最小公倍数
p=a*b;
num=fun(a,b);
printf("最大公约数为:%d\n最小公倍数:%d",num,p/num);
return 0;
}
欧几里德辗转相除法
首先举一个列子就15和9,演示如下:15%9=1........6 9%6=1........3 6%3=2......0,这样就可以得到公倍数为3,最小公约数直接用公式法进行求出即可。不过这种方法要有一个注意点:就是要保证前面的数比后面的要大,因此我这里在开始辗转相除前进行判断并进行转换。
#include
int main()
{
int n,m,t,s,p;
scanf("%d%d",&n,&m);
if(n { t=m; m=n; n=t; } p=m*n; while(m!=0) { s=n%m;//s存放余数 n=m; m=s; } printf("最大公约数:%d",n); printf("最小公倍数:%d",p/n); return 0; } 函数递归 函数具有递归和嵌套两种形式,这里我们讲述一下嵌套的两种形式一种有返回值,一种没返回值 这两种的调用方式是不一样的。有返回值时,可以使用“阶梯法”求解。 什么是阶梯法里:比如输入 15 9->9 6->6 3->3 0这种方法较好来理解就如台阶一样逐步向下,找到结果。 #include int fun(int n,int m) { if(m==0) return n; else return fun(m,n%m); } int main() { int n,m,t,s,p; scanf("%d%d",&n,&m); p=m*n; fun(n,m); printf("最大公约数:%d",fun(n,m)); printf("最小公倍数:%d",p/fun(n,m)); return 0; } 总结 通过这四个案例,可以较好回忆知识点,这四个案例主要应用函数,涉及函数调用和递归,递归在函数中扮演了非常重要的角色。希望各位大佬看到有问题可以积极指正,一起进步。