基于C++求两个数的最大公约数最小公倍数
求x,y最大公约数的函数如下:
int gys(int x,int y)
{ int temp;
while(x)
{temp=x;
x=y%x;
y=temp;}
return y;
}
x=y的时候一目了然下面就不考虑,仅针对x不等于y的情况.在程序执行的某次循环过程中,若x>y,那这次循环仅换成了x和y数值的交换。这一点很关键。假设x,y的最大公约数为m。我们想办法来表示两者:那么有三种情况(i,j均为大于等于0的整数)
1)x=m*(2i+1) y=m*(2i+1)(此种情况i不等于j)
2)x=m*(2i+1) y=m*2j
3)x=m*2i y=m*(2j+1)
发生有效循环时(这里的有效循环定义为除x,y交换数值循环外的循环,即x和y的数值至少有一个发生改变)。
(1)若是第一种表示,因为执行x=y%x时x<y(即i<j)(注意若输入的x>y,则发生有效循环时已经完成交换),那么这次循环执行完的时候 x=m*2(j-i),y=m*(2i+1),即此时可以认为x=m*偶数,y=m*奇数,那么由于(偶数-奇数=奇数)且(奇数-偶数=奇数),那么每执行一次有效循环(注意执行有效循环时,一定是y>x),执行x=y%x实际做的是x=m*(若干次奇数减偶数或者偶数减奇数的的混合),注意此时的x=m*1才会满足使x=y%x=0进而使循环终止,执行此次循环的y可以是y=m*偶数或者y=m*奇数,由于x执行前赋值给temp,故最后返回的为y=temp=m,就是最大公约数。
(2)第二种表示和第三种表示求公约数时实际上完全同第一种表示,因为只要是x,y为正整数且最大公约数为m,那么只要m*(2i+1),m*(2j+1),m*2(j-i)(或m*2(i-j))都大于0(此种情况i不等于j),最大公约数也是m。
例如若能表示成x=m*(2i+1) y=m*2j,他们的最大公约数和x=m*(2i+1) y=m*(2(i+j)+1)是一样的,这可以写成第一种表示方法嘛,第三种表示也是一目了然的依次类推。
这种方法也可以用来求x,y的最小公倍数,众所周知,最小公倍数==x*y/最大公约数
简而言之。利用欧几里得辗转相除法。gcd(a,b)=gcd(b,a%b);
基于C++求两个数的最大公约数最小公倍数的更多相关文章
- c语言实践:求两个数的最大公约数
我的思路是这样的:比如12和16这两个数.先理解一下概念,什么叫最大公约数.就是12有很多个因数,16也有很多个因数,这两堆因数中有一些重合的因数,在这些重合的因数中找到那个最大的.那么最大公约数一定 ...
- python 函数求两个数的最大公约数和最小公倍数
1. 求最小公倍数的算法: 最小公倍数 = 两个整数的乘积 / 最大公约数 所以我们首先要求出两个整数的最大公约数, 求两个数的最大公约数思路如下: 2. 求最大公约数算法: 1. 整数A对整数 ...
- 求两个数的最大公约数&求N个数的最大公约数
一.求两个数的最大公约数 如何编程计算N个数的最大公约数(Greatest common divisor)呢?第一想法那便是两两计算,但是往往最简单的想法是不怎么靠谱的.下面用递归来解决.递归有一大好 ...
- C++中用辗转相除法求两个数的最大公约数和最小公倍数
两个数的最大公约数:不能大于两个数中的最小值,算法口诀:小的给大的,余数给小的,整除返回小的,即最大公约数,(res=max%min)==0? max=min,min=res return min; ...
- 求两个数的最大公约数(Euclid算法)
求两个数 p 和 q 的最大公约数(greatest common divisor,gcd),利用性质 如果 p > q, p 和 q 的最大公约数 = q 和 (p % q)的最大公约数. 证 ...
- C++扬帆远航——14(求两个数的最大公约数)
/* * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:gongyueshu.cpp * 作者:常轩 * 微信公众号:W ...
- Java数据结构与算法之---求两个数的最大公约数(欧几里得算法)
一个简单的小算法来获取两个数的最大公约数, public class Test { public static void main(String[] args) { long result = gcd ...
- C实现辗转相除法求两个数的最大公约数
什么是辗转相除法? 辗转相除法(又名欧几里德算法),它主要用于求两个正整数的最大公约数.是已知的最古老的算法. 用辗转相除法求132和72的最大公约数的步骤: 132 / 72 = 1 ... 60 ...
- 求两个数的最大公约数(Java)
获得两个随机数(100以内),并放入数组中 public int[] getTwoRandom(){ int[] t = new int[2]; Random rand = new Random(); ...
随机推荐
- Microsoft SQL Server for Linux安装和配置
虽说mssql for linux早已经出来了,但原本没有打算这么早就去尝试的,无奈之下还是得先尝试用了,这里分几篇介绍我在用mssql for linux时遇到的问题,不得不说作为先吃螃蟹的人总是要 ...
- msdn - Developer Library(包括wpf)重要程度——5星*****
https://msdn.microsoft.com/zh-cn/library/ms754242(v=vs.110).aspx https://msdn.microsoft.com/zh-cn/li ...
- Office 2016 (Preview)
Office 2016 Preview for MAC (预览版) https://products.office.com/zh-CN/mac/mac-preview 安装下载:http://go.m ...
- 深入javascript之原型和原型链
原型和原型链是js中的难点也是重点,明白了原型和原型链会让我们在后面不管是学习还是工作都会更加高效,并且原型和原型链会是面试中必不可少的话题.看完此篇文章一定会让你对原型,原型链有深刻全面的了解. 一 ...
- 解决win10 phptoshop #fff纯白不是这样的白 显示器高级的问题
1.打开控制面板,右上角搜索栏输入“颜色管理”, 再打开“颜色管理”.2.在“设备”选项卡里,“设备”下拉列表,选择“显示器”.3.可能你安装过显示器的驱动程序,下面的配置文件中会有一个默认的配置文件 ...
- redis_学习_02_redis 可视化工具 Redis Desktop Manager
二.参考资料 1.Redis可视化工具Redis Desktop Manager使用 2.超好用的Redis管理及监控工具,使用后可大大提高你的工作效率!
- AngularJS-webapp($q)
$q延迟加载: 当一个数据需要请求多次,后面一个数据需要前面请求的数据时,我们就可以通过延迟加载进行数据传递 如下代码: 首先:我们需要得到职位信息: { "id": " ...
- Linux-监控与安全运维之cacti
一:cacti简介 Cacti 在英文中的意思是仙人掌的意思,Cacti是一套基于PHP,MySQL,SNMP及RRDTool开发的网络流量监测图形分析工具.它通过snmpget来获取数据,使用 RR ...
- OpenCV那个版本的比较好用、稳定,参考资料也较多的
2.4.8.上opencv官网就能下载到,对应不同版本的VS有编译好的文件. 2.4以后的变化不大.所以你可以百度opencv,有中文网站,上面有详细的说明.如果是在windows系统的话,可以使用v ...
- python 类的定义和继承
python 2 中类 一.类定义: ? 1 2 class <类名>: <语句> 类实例化后,可以使用其属性,实际上,创建一个类之后,可以通过类名访问其属性如果直接使用类 ...