当前位置: 首页 > news >正文

求两个正整数的最大公约数和最小公倍数:方法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;
}

相关文章:

  • openstack的网络和vpc网络底层原理有什么区别与联系
  • 添加物体.
  • MySQL 从入门到精通(五):索引深度解析 —— 性能优化的核心武器
  • 计算机网络 4-1 网络层(网络层的功能)
  • openstack的网络技术是怎样的
  • JAVA练习题(1) 卖飞机票
  • AJAX 请求方式
  • 【沉浸式求职学习day35】【Tomcat安装、配置】【Http简述】
  • anaconda部分基本指令
  • 车载学习(6)——CAPL(1)一些基础知识
  • Open CASCADE学习|Geom2d_BezierCurve 类
  • 4.9/Q1,GBD数据库最新文章解读
  • 蓝牙GAP协议概述
  • 中国古代史2
  • fota移植包合入后编译验证提示:File verification failed
  • java-代理
  • 【bibtex4word】在Word中高效转换bib参考文献,Texlive环境安装bibtex4word插件
  • CDGP历次主观题真题回忆
  • 微调ModernBERT为大型语言模型打造高效“过滤器”
  • PySide6 GUI 学习笔记——常用类及控件使用方法(常用类边距QMargins)
  • 人民日报:浙江着力提升民营企业核心竞争力
  • 中美经贸高层会谈将在午餐后继续
  • 2025上海十大动漫IP评选活动启动
  • 习近平出席俄罗斯纪念苏联伟大卫国战争胜利80周年庆典
  • 铲屎官花5万带猫狗旅行,宠旅生意有多赚?
  • 夜读丨古代有没有近视眼?