#大一小卡了咪的作业4
题目:
设计两个函数MaxCommonDevisor(n,m) 和MinCommonMultiple(n,m),分别求两个数的最大公约数和最小公倍数。主函数调用上述两个函数,实现功能。
乍一看这个题其实比较麻烦,因为要同时满足两个数的要求(同时整除/分别整除),但实际上可以通过以下方法来解决:
可用穷举法求最大公约数(从大到小找到的第1个公约数)和最小公倍数(从小到大找到的第1个公倍数)。
那么代码就可以写出来了:
#include<iostream>
using namespace std;
int MaxCommonDevisor(int n, int m)
{
if (m < n)
{
int temp = m;
m = n;
n = temp;
}
for (int i = m; i >= 1; i--) {
if (m % i == 0 && n % i == 0) {
return i;
break;
}
}
}
int MinCommonMultiple(int n, int m)
{
if (m < n)
{
int temp = m;
m = n;
n = temp;
}
for (int i = n; i <= m * n; i++) {
if (m == 0 || n == 0) { cout << "错误" << endl; }
if (i % m == 0 && i % n == 0) {
return i;
break;
}
}
}
int main() {
int m = 0, n = 0;
cout << "请输入m和n的值" << endl;
cin >> m >> n;
int a = MinCommonMultiple(m,n);
int b = MaxCommonDevisor(m,n);
cout << "最小公倍数为:" << a << endl;
cout << "最大公因数为:" << b << endl;
system("pause");
return 0;
}
运行结果如图所示
补充:有能力的同学可以尝试更高阶的算法--欧几里得算法:
#include <iostream>
using namespace std;
int mcd(int m, int n)
{
// 使用欧几里得算法求最大公约数
while (n != 0)
{
int temp = n;
n = m % n;
m = temp;
}
return m;
}
int mcm(int m, int n)
{
// 最小公倍数通过最大公约数来计算
int gcd = mcd(m, n);
return (m / gcd) * n; // 防止溢出,先除后乘
}
int main()
{
int a, b, c, d;
cout << "请输入两个整数" << endl;
cin >> a >> b;
c = mcd(a, b);
d = mcm(a, b);
cout << "最大公约数为:" << c << endl;
cout << "最小公倍数为:" << d << endl;
return 0;
}
运行结果同样正确,希望可以对大家有帮助!!
标签:return,cout,temp,公倍数,C++,int,最大公约数,公因数 From: https://blog.csdn.net/weixin_74325745/article/details/143660813