解题—求两数的最大公约数与最小公倍数 #辗转相除法

news2025/1/11 9:47:38

文章目录

前言

一、最大公约数

方法一:硬解

方法二:辗转相除法

1、图形理解:

 2、公式理解:

二、最小公倍数

方法一:硬解

方法二:巧解

总结


前言

路漫漫其修远兮,吾将上下而求索。


一、最大公约数

假设输入的两个值为m 与 n ;

方法一:硬解

总所周知,最大公约数一定小于等于输入两个值中的最小值;

倘若 n > m ,那么这两个数的最大公约数一定小于等于 n  ; 而最大公约数同时满足被 n 与 m 整除;

故而其代码如下:

#include<stdio.h>

int main()
{
	int n = 0;
	int m = 0;
	while (scanf("%d %d", &n, &m)!= EOF)
	{
		int max = n > m ? n : m;
		int min = n < m ? n : m;
		//最大公约数
		int gcd = min;
		while (1)
		{
			if (n % gcd == 0 && m % gcd == 0)
				break;

			gcd--;
		}
		printf("%d\n", gcd);
	}
	return 0;
}

方法二:辗转相除法

辗转相除法又称为欧几里得算法,用于计算两个非负整数m,n的最大公约数。

1、图形理解:

例如:需求 624 与 1404 的最大公约数;如下图所示:

将数据 624 与 1404 转换成一个矩形而要被一个最大的正方形填充;

在上图中可以清楚地发现,将短边在长边中组成正方形,不看正方形部分于是乎就又形成了一个新的长方形,又在这个新长方形中用短边组成长方形来填充……直到所有面积均被划分地正方形填充,那么此正方形便是填充这个长方形的最大正方形;(看下图可能会明显一点)

转换成数学语言就是将余数除以被除数(余数一定小于被除数)得到的余数再除以上一个式子的被除数;

体现在上图中就是不停地在长边中划分短边的正方形……一直重复直到长边完全被短边划分;那么此时的短边正方形便是填充原矩形的最大正方形;

那么体现成数学公式便为:

 2、公式理解:

默认 a,b 为整数,而求a ,b 的最大公约数;

(a,b)-->求 a,b 的最大公约数(a,b)

本质原理:a/b=q…r

如果有两个整数a,b 便会存在唯一的一个整数q和r,满足式子 a/b=q...r

经过上面图形的启发,我们可得知:(a,b)=(b,r)

如何验证这个公式呢?
由a/b=q…r,可得a=b*q+r;以及r=a-b*q;

  • 假设(a,b) = d1; 则可以得到 a= d1*m,b=d1*n,其中(n,m)=1,即m与n 互质;存在n与m均属于整数那么可知:r=d1*m -di*n*q= d1(m-ng);

  • 假设 (b,r) =d2;则可以得到 b=d2*m,r=d2*n,其中(m,n)=1,存在n与m均属于整数;那么可知:a=d2*m*q+d2*n= d2*(m*q+n)


而又存在(a , b, c, d)=((a,b),c, d);所以(a, b,r )=((a,b),r)=( a,(b,r));

  • ((a,b),r)=(d1,r)=(d1,d1(m-ng))=d1;因为m,n,g必为整数,所以 m-ng 必为整数,故而其最大公约数为d1;
  • (a,(b,r))=(a,d2)=(d2*(m*g+n),d2)= d2 ;

然而a br这三个整数只存在唯一的最大公约数,故而 d1=d2;

即(a,b)=(b,r)得以验证

即存在:

代码如下:

//辗转相除法
#include<stdio.h>

int main()
{
	int n = 0;
	int m = 0;
	int gcd = 0;
	while (scanf("%d %d", &m, &n) != EOF)//多组输入
	{
		while (m%n)//
		{
			int c = m % n;
			m = n;//被除数当作除数
			n = c;//余数当作被除数
		}
		//当循环停止时,即计算下去无余数时此时的被除数便为最大公约数
		gcd = n;

		printf("最大公约数为%d\n", gcd);

	}

	return 0;
}

代码运行结果如下:

二、最小公倍数

假设输入的两个值为m 与 n ;

方法一:硬解

可知,最小公倍数的一定小于等于两数之积而大于等于两数中的较大值;

代码如下:

//最大公倍数
#include<stdio.h>

int main()
{
	int m = 0;
	int n = 0;
	while (scanf("%d %d", &m, &n) != EOF)
	{
		int lcm = n > m ? n : m;
		while (1)
		{
			if (lcm % n == 0 && lcm % m == 0)
				break;
			lcm++;
		}
		printf("最小公倍数为:%d\n", lcm);
	}

	return 0;
}

代码运行结果如下:

方法二:巧解

在得知最大公约数的情况下满足 : m*n = 最大公约数*最小公倍数;

为什么呢?

如下图:

假设 m = 76x , n = 27x ;那么可知 m*b = 76* x * 27 *x;

而最小公约数为 x ,最大公倍数为 76*27*x; --> 所以得知 m*n = 最大公约数*最小公倍数;

代码如下:

#include<stdio.h>

int main()
{
	int n = 0;
	int m = 0;
	int gcd = 0;
	int lcm = 0;
	while (scanf("%d %d", &m, &n) != EOF)
	{
		//最大公约数
		int i = m;//保护 m,n
		int j = n;
		while (i % j)
		{
			int ret = i % j;
			i = j;
			j = ret;
		}
		gcd = j;
		//最小公倍数
		lcm = (n / gcd) * (m / gcd) * gcd;

		printf("最小公倍数为:%d", lcm);
	}
	return 0;
}

代码运行结果如下:


总结

假设需求m,n 的最大公约数与最小公倍数;

最大公约数:硬解;辗转相除法

最小公倍数:硬解;巧解(辗转相除法+原理:m*n = 最大公约数*最小公倍数)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2065104.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

spring security 入门基础,表单认证web页面跳转

一、导入所需依赖 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.6.2</version></parent><!-- web 支持 --><dependency><groupId>…

机械学习—零基础学习日志(如何理解概率论5)

这里我们学习随机变量的独立性 我们这里也来一个习题。 《概率论与数理统计期末不挂科|考研零基础入门4小时完整版&#xff08;王志超&#xff09;》学习笔记 王志超老师 &#xff08;UP主&#xff09;

旧物上门回收系统架构分析

随着环保意识的增强和资源循环利用的重视&#xff0c;旧物上门回收系统逐渐成为现代城市生活的一部分。这些系统通过先进的技术架构&#xff0c;实现了废品的高效回收与再利用&#xff0c;为环境保护和可持续发展做出了积极贡献。本文将从系统架构的角度&#xff0c;对旧物上门…

Linux--网络层 IP协议

目录 0.往期文章 1.IP基本概念 2. IP协议报头格式 3.网段划分 两种网段划分的方式 为什么要进行网段划分 4.特殊的IP 地址 5.IP 地址的数量限制 6.私有 IP 地址和公网 IP 地址*** NAT技术 认识公网 运营商扮演的角色 7.路由 8.16位标识&#xff0c;3为标志和13位…

leetcode:2733. 既不是最小值也不是最大值(python3解法)

难度&#xff1a;简单 给你一个整数数组 nums &#xff0c;数组由 不同正整数 组成&#xff0c;请你找出并返回数组中 任一 既不是 最小值 也不是 最大值 的数字&#xff0c;如果不存在这样的数字&#xff0c;返回 -1 。 返回所选整数。 示例 1&#xff1a; 输入&#xff1a;nu…

vue3【组件封装】日历 (默认标注今日,可选择日期,可标注日期,可切换月份,样式仿 Win11)

效果预览 技术要点 获取每个月最后一天 下个月的第0天,自动会被解析为本月的最后一天 let lastDay = computed(() => new Date(year.value, month.value, 0).getDate());flex 布局末行左对齐 最靠谱的方式是想办法将末行缺失元素填满 本范例中,因星期固定7列,按每月最…

Centos7.6-DNS服务安装与配置

1、安装bind 软件包 首先&#xff0c;需要安装 bind 软件包&#xff0c;这可以通过运行以下命令来完成&#xff1a; [rootlocalhost ~]# yum install bind 已加载插件&#xff1a;fastestmirror, langpacks Loading mirror speeds from cached hostfile* base: mirrors.aliyun…

string转nlohmann::json问题

如果用字符串赋值构造函数&#xff0c;出现如下问题&#xff1a; std::string message; ​​nlohmann::json info(message); 如果按照如下代码则是正常的&#xff1a; std::string message; ​​nlohmann::json info nlohmann::json::parse(message);

Vue项目创建和使用

快速上手 | Vue.js (vuejs.org) nodejs.org/ vue项目实质上是index.html页面和多个js文件的集合&#xff0c;最终解析后的html和js代码可以由浏览器解析运行&#xff1a; vue项目的创建&#xff0c;需要脚手架工具来搭建&#xff1b; 在编译的源码阶段&#xff0c;文件格式为.…

FPGA开发——verilog的运算符以及相关优先级的介绍

一、简介 在我们学习任何一门编程语言时&#xff0c;不可避免的都会遇见运算符和相关的运算优先级的问题&#xff0c;只有掌握了各个运算符的优先级关系我们才能进行更好的代码编写。在前面的时候因为我没有遇到因为优先级而导致的工程结果错误&#xff0c;所以没有过多注意&am…

振兴杯全国青年职业技能大赛职业技能标准——物联网安装调试员

一、大赛概述 1.1 振兴杯全国青年职业技能大赛简介 振兴杯全国青年职业技能大赛是一项国家级的职业技能竞赛&#xff0c;自2005年首届大赛成功举办以来&#xff0c;已逐渐成为国内规模最大、影响力最广的青年职业技能竞赛之一。这项竞赛旨在推动青年技能人才的培养和发展&…

软件测试面试题与经验分享【附文档】

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 测试技术面试题 1、什么是兼容性测试&#xff1f;兼容性测试侧重哪些方面&#xff1f; 参考答案&#xff1a; 兼容测试主要是检查软件在不同的硬件平台、软…

黄金市场波动加剧美联储降息预期与数据修正共舞

美联储鸽派信号提振金价 周四亚市盘中&#xff0c;现货黄金价格突然加速回落&#xff0c;逼近2500美元/盎司关键支撑位&#xff0c;日内重挫逾10美元。尽管如此&#xff0c;美联储周三发布的鸽派会议纪要显示&#xff0c;政策制定者普遍倾向于9月降息&#xff0c;为金价提供了…

linux系统,ubuntu安装英伟达NVIDIA4090显卡驱动

文章目录 前言下载英伟达NVIDIA官方驱动安装NVIDIA驱动远程安装关闭交互界面设置权限&#xff08;自己确认版本号5&#xff09;安装&#xff08;自己确认版本号5&#xff09;打开交互界面&#xff0c;并重启系统验证是否安装成功 异常处理问题1问题2问题3&#xff08;可能没解决…

docker手动部署django项目Dockerfile编排-后端发布

1、首先创建一个桥接网络 docker network create auto 2、部署redis,提供celery的消息队列服务 docker run --name redis --restartalways -d --network auto -v redis:/data redis:alpine3、部署数据库 注意数据库账号密码 docker run --name mariadb --restartalways -d…

vue3+ts+vant4 列表下拉刷新+分页加载

效果图 主要代码&#xff1a; <van-pull-refreshv-model"refreshing"refresh"handleRefresh"pulling-text"下拉释放刷新"loosing-text"下拉释放刷新"loading-text"加载中"><van-listv-model:loading"loading…

DDD精粹速读(一)

1 你需要知道的 - 战略设计 DDD是一种软件设计和构建方法&#xff0c;其重点在于独立于数据持久化等技术问题&#xff0c;准确表达业务规则。 不幸&#xff0c;DDD 对新手来说极具挑战性&#xff0c;部分原因是它有许多独特的概念需要学习。本文我简要介绍这些重要的思想&…

数学建模比赛(国赛)水奖攻略

之前很多同学私聊问我&#xff0c;学校要求参加数模比赛&#xff0c;但是不擅长建模编程&#xff0c;但又不想浪费这个时间该怎么办呢&#xff0c;今天就来给大家讲一下大家都非常感兴趣的内容——数学建模水奖攻略。分享一下博主直接参加比赛时候的经验。 一、选题技巧 有一句…

【QT】学习笔记:关于“初始化列表中的成员变量”

一、问题1 以下代码是什么意思&#xff1f; MainWindow::MainWindow(QWidget *parent): QMainWindow(parent) , ui(new Ui::MainWindow) {ui->setupUi(this); }MainWindow::~MainWindow() {delete ui; } 好的&#xff0c;我来为你解释这段 Qt 代码&#xff1a; 整体概述…

Linux(面试篇)

目录 什么是Linux 什么是Linux内核&#xff1f; Linux的基本组件是什么&#xff1f; Bash和Dos之间基本区别是什么&#xff1f; 什么是Root账户 什么是Bash? 什么时CLI? Linux的目录结构时怎样的&#xff1f; 什么是硬链接和软链接&#xff1f; 什么叫CC攻击&#…