一、直接法
1、最大公约数
假定两个数m,n,两个数的最大公约数必定小于或等于m,n中较小的那个数,所以先要找到m,n中较小的那个数,用min来接收,然后用循环,每次循环令min-1,在循环中判断m,n是否能被min整除,能的话把min赋值给t,用break结束循环,t就为lm,n的最大公约数。例如:m=12,n=10,两数较小的值为10->min,每次循环min-1,知道min=2时,m,n都可以整除min,把min->t,break循环结束。
#include <stdio.h>
int main()
{
int m,n,min,t=0;
scanf("%d %d",&m,&n);
min=m>n?n:m;
for(min; min>=1; min--)
{
if(m%min==0&&n%min==0)
{
t=min;
break;
}
}
printf("%d",t);
return 0;
}
2、最小公倍数
假定两个数m,n,最小公倍数必定大于等于两个数中的较大值,用max来接收,像求最大公约数一样,用循环结构,使max每次循环结束加1,直到max可以整除m和n时用break结束循环,此时把max就是m,n的最小公倍数。例如:m=3,n=2,两个数中较大值为m,m->max,进入循环后,max每次加1,知道max等于6时,max可以整除m和n,此时break跳出循环。
#include <stdio.h>
int main()
{
int m,n,max,t=0;
scanf("%d %d",&m,&n);
max=m<n?n:m;
for(max; ; max++)
{
if(max%m==0&&max%n==0)
{
t=max;
break;
}
}
printf("%d",t);
return 0;
}
二、辗转相除法
什么是辗转相除法?(来自百度)
欧几里得算法又称辗转相除法,是指用于计算两个非负整数a,b的最大公约数。应用领域有数学和计算机两个方面。计算公式gcd(a,b) = gcd(b,a mod b)。
两个整数的最大公约数是能够同时整除它们的最大的正整数。辗转相除法基于如下原理:两个整数的最大公约数等于其中较小的数和两数相除余数的最大公约数。
利用辗转相除法,我们可以同时求最大公约数和最小公倍数
# include <stdio.h>
int main()
{
int n,m,min,max;
printf("请输入两个正整数m和n:");
scanf("%d %d",&m,&n);
int c=m%n;
int b=m*n;
while(c!=0)
{
m=n;
n=c;
c=m%n;
}
max=n;
min=b/max;
printf("\n最大公约数为:%d\n最小公倍数为:%d\n",max,min);
return 0;
}
三、更相减损法
更相减损法是出自《九章算术》的一种求最大公约数的算法。
它的具体做法是:
第一步,任意给定两个正整数,先判断它们是否都是偶数,若是,则用2约简,若不是,则执行第二步。
第二步,以较大的数减较小的数,接着把所得的差与较小的数比较,并以大数减小数。继续这个操作,直到所得的减数和差相等为止。
则第一步中约掉的若干个2与第二步中最终的等数的乘积就是所求的最大公约数。
例1、用更相减损术求98与63的最大公约数。
解:由于63不是偶数,把98和63以大数减小数,并辗转相减:
98-63=35
63-35=28
35-28=7
28-7=21
21-7=14
14-7=7
所以,98和63的最大公约数等于7。
#include<stdio.h>
int main()
{
int m=0;
int n=0;
scanf("%d %d",&m,&n);//输入2个数
while(a!=b)//大数-小数,差赋给大数,然后差和小数再比较,直到a=b
{
if(a>b)
a-=b;
else
b-=a;
}//这里省略比较a=b,当a=b时,最大公约数=b
printf("最大公约数为%d\n",b);
return 0;
}
#include <stdio.h>
int main()
{
int a = 0;
int b = 0;
scanf("%d%d", &a, &b);
int i = 1;
while (1)
{
if (a * i % b == 0)
{
break;
}
i++;
}
printf("%d\n", a * i);//a*i即为a和b的最小公倍数
return 0;
}