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

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

http://www.xdnf.cn/news/5227.html

相关文章:

  • 01 | 大模型微调 | 从0学习到实战微调 | AI发展与模型技术介绍
  • STM32实现九轴IMU的卡尔曼滤波
  • 如何在postman使用时间戳
  • Windows下的临界写法
  • 回文数(9)
  • 气象大模型光伏功率预测中的应用:从短期,超短期,中长期的实现与开源代码详解
  • C++GO语言微服务之图片、短信验证码生成及存储
  • 【沉浸式求职学习day35】【Tomcat安装、配置】【Http简述】
  • Linux指令入门:DevOps与SRE视角
  • SDC命令详解:使用all_outputs命令进行查询
  • 轻松制作高质量视频,实时生成神器LTX-Video重磅登场!
  • 睿思量化小程序
  • LeetCode 88. 合并两个有序数组 | Python 最简写法 + 实战注释
  • Java面向对象
  • bcm5482 phy 场景总结
  • 技嘉主板BIOS升级
  • 树 Part 4
  • D. Apple Tree Traversing 【Codeforces Round 1023 (Div. 2)】
  • NX949NX952美光科技闪存NX961NX964
  • 短剧 CPS 分销系统开发搭建,开启流量变现新征程
  • 数字签名与证书
  • 北斗终端设备应用
  • 【含文档+源码】基于SpringBoot的新能源充电桩管理系统的设计与实现
  • ODA服务器计算节点本地硬盘状态异常的处理
  • 【金仓数据库征文】国产数据库KingbaseES安装与使用详解
  • 202535| Kafka架构与重要概念+幂等性+事务
  • [架构之美]Spring Boot多环境5种方案实现Dev/Test/Prod环境隔离
  • kafka的安装及简单使用
  • 【并发编程】基于 Redis 手写分布式锁
  • 【源码+文档+调试讲解】高校创新创业课程124