题目描述:
已知3个正整数,计算这3个正整数的最大公约数。
输入:输入一行3个不大于1000正整数.
输出:输出数据也只有一行,给出这3个正整数的最大公约数
【样例】:
输入:3 6 12
输出:3
程序如下:
#include <stdio.h>
//功能函数
int ComDiv(int a, int b) { //利用辗转相除法得出a,b的最大公约数
while(b != 0) { //当b等于0说明计算结束,此时a保存的值就是最大公约数
int c = a%b;
a = b;
b = c;
}
return a;
}
int main(int argc, char* argv[]) {
int a, b, c;
scanf(" %d%d%d", &a, &b, &c);
//也就相当于先用DomDiv函数求出b,c的最大公约数,再求出b,c最大公约数和a的最大公约数
printf("%d", ComDiv(a, ComDiv(b, c)));
return 0;
}
终端输出:
辗转相除法求最大公约数原理:
例子
假设我们要计算 48 和 18 的最大公约数。
【补充】:
最大公约数和最小公倍数的关系:
公式推导:
程序如下:
#include <stdio.h>
// 辗转相除法求 GCD
int gcd(int a, int b) {
while (b != 0) {
int temp = b;
b = a % b;
a = temp;
}
return a;
}
// 利用 GCD 计算 LCM
int lcm(int a, int b) {
return a * (b / gcd(a, b));
}
int main() {
int a, b;
printf("请输入两个整数: ");
scanf("%d %d", &a, &b);
int gcd_result = gcd(a, b);
int lcm_result = lcm(a, b);
printf("最大公约数是: %d\n", gcd_result);
printf("最小公倍数是: %d\n", lcm_result);
return 0;
}
引用:
材料《ACM-ICPC》