大家好,又见面了,我是你们的朋友全栈君。
题目:输入两个正整数m和n,求其最大公约数和最小公倍数。
- 方法一:短除法
理论参考:百度知道
#include <stdio.h>
int main() {
int m, n; // 两个输入的数
int x = 1, y; // x 是最大公约数,y是最小公倍数
int i = 2; // 累乘因子,从 2 开始
printf("请输入 m 和 n:\n");
scanf("%d%d", &m, &n);
// 将输入的两个数调整位置,m 是较大的那个数,n 是较小的那个数
if (m < n) {
m = m + n;
n = m - n; // m(m + n) - n(n) = m
m = m - n; // m(m + n) - n(m) = n
}
if (m % n == 0) {
// 两个数成倍数
printf("最大公约数:%d\n最小公倍数:%d\n", n, m);
} else {
// 不成倍数
// 计算最大公约数
while (i < n) {
// 当累乘因子小于较小值时,继续计算
if (m % i == 0 && n % i == 0) {
// 同时为两个数的乘法因子
m /= i;
n /= i;
x *= i;
} else {
i++;
}
}
// 计算最小公倍数
y = x * m * n;
printf("最大公约数:%d\n最小公倍数:%d\n", x, y);
}
}
- 方法二:遍历法
# include<stdio.h>
int main()
{
int m, n; // 两个输入数
int x, y; // x 为最大公约数,y 为最小公倍数
int min, max; // max 为两个输入数中,较大的一个,min 为较小的一个
int i; // 用于 for 循环遍历
printf("请输入 m 和 n:\n");
scanf("%d %d", &m, &n);
min = m > n ? n : m;
max = m > n ? m : n;
x = 1; // 公约数初始化设为 1
if (max % min == 0) {
// 两个数是倍数关系
printf("最大公约数:%d\n最小公倍数:%d\n", min, max);
} else {
// 不成倍数
// 寻找最大公约数
for (i = 1; i <= min; i++) {
// 从 1 找到 min
if (max % i == 0 && min % i == 0) x = i;
}
// 寻找最小公倍数
while (max % m != 0 || max % n != 0) {
// 当有一方不能被整除时,继续往后找
max++;
}
y = max;
printf("最大公约数为:%d\n最小公倍数为:%d", x, y);
}
}
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/145832.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...