在刷题的过程中,经常会遇到很多关于最大公约数的问题。
1.辗转相除法。
辗转相除法, 又名欧几里德算法(Euclidean algorithm),是求最大公约数的一种方法。它的具体做法是:用较小数除较大数,再用出现的余数(第一余数)去除除数,再用出现的余数(第二余数)去除第一余数,如此反复,直到最后余数是0为止。如果是求两个数的最大公约数,那么最后的除数就是这两个数的最大公约数。
用C语言就是:
#include <stdio.h>
int main()
{
int a,b,c;
scanf ("%d%d",&a,&b);
while (b)
{
c=a%b;
a=b;
b=c;
}
printf ("%d\n",a);
return 0;
}
这种的是最简单的。
2.更相减损法。
更相减损术是我国古代《九章算术》中介绍的一种求两个正整数最大公约数的一种算法,其算法是对于给定的两个正整数,用较大的数减去较小的数,然后将差和较小的数构成新的--对数,对这一对数再用较大的数减去较小的数,将差和较小的数构成新的一对数,反复执行此步骤直到差和较小的数相等,此时这个数便为原来两个数的最大公约数.
#include <stdio.h>
int main()
{
int a,b;
printf ("请输入两个整数\n");
while(scanf("%d%d",&a,&b)!=EOF)
{
while(a!=b)
{
if(a>b)
a=a-b;
else
b=b-a;
}
printf ("%d\n",a);
}
return 0;
}
例如 20 和40 的最大公约数为20
3.穷举法
穷举法(枚举法)的基本思想是:列举出所有可能的情况,逐个判断有哪些是符合问题所要求的条件,从而得到问题的全部解答。
#include <stdio.h>
int main()
{
printf ("请输入两个整数:\n");
int a,b,c;
while(scanf("%d%d",&a,&b)!=EOF)
{
int max=1; //记录最大公约数
c=a>b?b:a; //c等于a和b中小的数 ,这里使用了三目运算符
for(int i=1;i<=c;i++)
{
if(a%i==0&&b%i==0)
{
if(i>max)
max=i;
}
}
printf("%d\n",max);
}
return 0;
}
这里还是用20和40来运算
答案还是 20