C程序设计 (第四版) 谭浩强 习题5.3 个人设计
习题 5.3 输入两个正整数m和n,求其最大公约数和最小公倍数。
最大公约数与最小公倍数的乘积是两个数的乘积。
IDE工具:VS2010
Note: 使用不同的IDE工具可能有部分差异。
代码块
方法1:使用while循环、欧几里得算法
#include <stdio.h>
#include <stdlib.h>
int main(){
int m, n, a, b, r, g;
//输入正整数m和n
printf("Please enter m and n: ");
scanf("%d %d", &m, &n);
a = m;
b = n;
r = m % n;
while (r != 0){
m = n;
n = r;
r = m % n;
}
g = a * b / n;
printf("HCF = %d\n", n); //最大公约数
printf("LCM = %d\n", g); //最小公倍数
system("pause");
return 0;
}
方法2:使用for循环、短除算法
#include <stdio.h>
#include <stdlib.h>
int main(){
int m, n;
//输入正整数m和n
printf("Please enter m and n: ");
scanf("%d %d", &m, &n);
//短除法判断
for (int i = 2, s = 1, x = m, y = n; i <= m && i <= n;){
!(m % i) && !(n % i) ? s *= i, m /= i, n /= i, i = 2 : i++;
}
printf("HCF=%d\n", s); //输出最大公约数
printf("LCM=%d\n", x * y / s); //输出最小公倍数
system("pause");
return 0;
}
方法3:使用指针、函数的模块化设计
#include <stdio.h>
#include <stdlib.h>
int HCF(int *m, int *n){
int x = *m;
int y = *n;
for(int mod = x % y; mod != 0; mod = x % y){
x = y;
y = mod;
}
return y;
}
int LCM(int *m, int *n){
return *m * (*n) / HCF(m, n);
}
int main(){
int *m = (int*)malloc(sizeof(int));
int *n = (int*)malloc(sizeof(int));
printf("Enter m, n: ");
scanf_s("%d %d", m, n);
printf("HCF = %d\n", HCF(m, n));
printf("LCM = %d\n", LCM(m, n));
free(m);
free(n);
system("pause");
return 0;
}