一、暴力算法
代码如下:
#include <stdio.h>
int main()
{
int x = 0;
int y = 0;
int tmp = 0;
int i = 0;
scanf("%d%d", &x, &y);
if (x < y)
{
tmp = x;
x = y;
y = tmp;
}
for (i = y; i > 0; i--)
{
if (x % i == 0 && y % i == 0)
{
printf("最大公约数为:%d\n", i);
break;
}
}
return 0;
}
第一个 if
语句是为了让小的数为 y ,下面从y开始,这样能减少运算量。
下面的 for
循环,就是遍历找到最大公约数。
二、辗转相除法
先介绍一下原理
1.先用x除以y(这里默认x>y)
2.若余数为0,则y为最大公约数;
若余数不为0,则令x=y,y=余数,然后重复步骤1,直到余数为0,此时y为最大公约数。
代码如下:
#include <stdio.h>
int main()
{
int x = 0;
int y = 0;
scanf("%d%d", &x, &y);
int i = 0;
if (x < y)
{
int tmp = x;
x = y;
y = tmp;
}
while (x % y)
{
i = x % y;
x = y;
y = i;
}
printf("最大公约数为:%d", y);
return 0;
}
三、更相减损法
1.x - y = r
2.若 r = 0 ,则 x = y ,最大公约数为它本身;
若 r ≠ 0,则令x=y和r中较大的一个数,y=剩下的另一个数,重复步骤1直到r=0,此时的x=y,即为最大公约数。
#include <stdio.h>
int main()
{
int x = 0;
int y = 0;
scanf("%d%d", &x, &y);
int max = 0;
int r = 0;
if (x < y)
{
int tmp = x;
x = y;
y = tmp;
}
while (x - y)
{
r = x - y;
if (y > r)
{
x = y;
y = r;
}
else
x = r;
}
printf("最大公约数为:%d", y);
return 0;
}