#include "stdio.h"
void main() {
//接收输入的两个数中的较大值和较小值
int max, min;
//用于for循环
int i;
//接收输入的两个数
int m, n;
//a接收最大公约数 b接收最小公倍数
int a, b;
printf("请输入两个正整数:");
scanf("%d%d", &m, &n);
//判断两个数的大小关系
max = m > n ? m : n;
min = m > n ? n : m;
//如果输入的两个数是倍数关系,那么较大值为两者的最小公倍数,较小值为两者最大公约数
if (max % min == 0) {
a = min;
b = max;
printf("%d和%d的最大公约数是%d,最小公倍数是%d", max, min, a, b);
} else {
//如果不成倍数关系
//求最大公约数 从2开始遍历到 min/2
//默认最大公约数是1
a = 1;
for (i = 2; i <= min/2; i++) {
if (max % i == 0 && min % i == 0) {
a = i;
}
}
//求最小公倍数 从max开始遍历到 max*min
//默认最小公倍数是两者的较大值
b = max;
for (i = max; i <= max * min; i++) {
if (i % max == 0 && i % min == 0) {
b = i;
//找到最小公倍数后结束循环
break;
}
}
printf("%d和%d的最大公约数是%d,最小公倍数是%d", max, min, a, b);
}
}
辗转相除法求最大公约数:
辗转相除法, 又名欧几里得算法(Euclidean algorithm),目的是求出两个正整数的最大公约数。它是已知最古老的算法, 其可追溯至公元前300年前。 这条算法基于一个定理:两个正整数a和b(a>b),它们的最大公约数等于a除以b的余数c和b之间的最大公约数。比如10和25,25除以10商2余5,那么10和25的最大公约数,等同于10和5的最大公约数。
#include "stdio.h"
void main()
{
int m,n;
int r;
printf("请输入两个数:");
scanf("%d%d",&m,&n);
//r是余数
r=m%n;
while(r)
{
m=n;
n=r;
r=m%n;
}
printf("这两个数的最大公约数是:%d",n);
}
初学C语言,如有错误,还望指正,因考试需要,代码运行环境为:
不同编译器和不同版本C语言代码略有不同。