法一:辗转相除法
/*辗转相除法
m n t t=m%n
18 12 6 t为大数取余小数的结果
12 6 0 m为上一轮中n与t中较大的那个数
6 0 n为上一轮中n与t中较小的那个数
直到n为0时,m的值就是两数的最大公约数
*/
#include <stdio.h>
int main()
{
int m, n, t;
printf("请输入m和n的值:\n");
scanf("%d%d", &m, &n);
while (n != 0)
{
t = m % n;
m = n;
n = t;
}
printf("最大公约数为%d\n", m);
return 0;
}
法二:穷举法
//令i为两数中较小的数,每进行一次i都要-1,将两数分别取余i,直到i取余m和n都为0时,i就是它们的最大公约数
#include <stdio.h>
int main()
{
int n, m, gcd;
printf("请输入m和n的值:\n");
scanf("%d%d", &m, &n);
int min = m < n ? m : n;//让min等于输入的最小那个数
for (int i = min; i > 0; i--)//从输入的最小的数开始除,直到一个数取余m和n都为0时,这个数就是它们的最大公约数
{
if (n % i == 0 && m % i == 0)
{
gcd = i;
break;
}
}
printf("%d和%d的最大公约数为%d\n", m, n, gcd);
return 0;
}
法三:更相减损法
/* 更相减损法
m n t m n t
18 12 6 25 20 5 t为m与n的差
12 6 6 20 5 15 m为上一轮中n与t中较大的那个数
6 6 0 15 5 10 n为上一轮中n与t中较小的那个数
10 5 5 直到t为0时,n的值就是两数的最大公约数
5 5 0
*/
#include <stdio.h>
int main()
{
int m, n, t;
printf("请输入m和n的值:\n");
scanf("%d%d", &m, &n);
while (1)
{
int max = m > n ? m : n;
int min = m > n ? n : m;
t = max - min;
if (t == 0)
break;
else
{
m = n > t ? n : t; // m为上一轮中n与t中较大的那个数
n = n > t ? t : n; // n为上一轮中n与t中较小的那个数
}
}
printf("最大公约数为%d\n",n);
return 0;
}