求两个正整数的最大公约数和最小公倍数:方法1:辗转相除法
辗转相除法也称阿基米德辗转相除法。
算法步骤如下:
1、若两个正整数分别为a和b。两者中大者做被除数(dividend),小者做除数(divisor)。
2、计算dividend和divisor的余数(remainder)。
3、若remainder = 0,则步骤2中的divisor即最大公约数。
4、若remainder != 0,则将步骤2中的divisor给dividend,将步骤3中remainder给divisor,重复1~4步骤,直到divisor < remainder或remainder=0为止。
得到最大公约数后,用两个正整数相乘的积,除以最大公约数的商,即他们的最小公倍数。
// 求两个数的最大公约数.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include <iostream>
#include <cstdint>
using namespace std;
#define SYS_INVALID_U32 0xFFFFFFFF
#define BASE_EACH_PRIME 0x00000001
#define BASE_INVALID_ARGS 0x00000002
uint32_t FindGreatestCommonDivisor(uint32_t a, uint32_t b)
{
uint32_t dividend = 0;
uint32_t divisor = 0;
uint32_t ultemp = 0;
uint32_t remainder = SYS_INVALID_U32;
if (a <= 0 || b <= 0) {
return BASE_INVALID_ARGS;
}
dividend = a;
divisor = b;
while (divisor != 0) {
if (dividend < divisor) {
ultemp = dividend;
dividend = divisor;
divisor = ultemp;
}
remainder = dividend % divisor;
if (remainder == 0) {
return divisor;
}
if (dividend <= divisor) {
break;
}
dividend = divisor;
divisor = remainder;
}
return BASE_EACH_PRIME;
}
uint32_t FindLeastCommonMultiple(uint32_t a, uint32_t b)
{
if (b == 0) {
return BASE_INVALID_ARGS;
}
else if (a % b != 0) {
return BASE_INVALID_ARGS;
}
return (a / b);
}
int main()
{
uint32_t x = 0;
uint32_t y = 0;
uint32_t greatest_common_divisor = 0;
uint32_t least_common_multiple = 0;
cin >> x >> y;
greatest_common_divisor = FindGreatestCommonDivisor(x, y);
if (greatest_common_divisor == BASE_INVALID_ARGS) {
cout << "输入的两个正整数不合规!" << endl;
return 0;
} else if (greatest_common_divisor == BASE_EACH_PRIME) {
cout << "两个正整数互为质数!" << endl;
return 0;
}
least_common_multiple = (x * y) / greatest_common_divisor;
cout << x << " 和 " << y << " 的最大公约数是 " << greatest_common_divisor << endl;
cout << x << " 和 " << y << " 的最小公倍数是 " << least_common_multiple << endl;
return 0;
}