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++求两个数的最大公约数最小公倍数的更多相关文章

  1. c语言实践:求两个数的最大公约数

    我的思路是这样的:比如12和16这两个数.先理解一下概念,什么叫最大公约数.就是12有很多个因数,16也有很多个因数,这两堆因数中有一些重合的因数,在这些重合的因数中找到那个最大的.那么最大公约数一定 ...

  2. python 函数求两个数的最大公约数和最小公倍数

    1. 求最小公倍数的算法: 最小公倍数  =  两个整数的乘积 /  最大公约数 所以我们首先要求出两个整数的最大公约数, 求两个数的最大公约数思路如下: 2. 求最大公约数算法: 1. 整数A对整数 ...

  3. 求两个数的最大公约数&求N个数的最大公约数

    一.求两个数的最大公约数 如何编程计算N个数的最大公约数(Greatest common divisor)呢?第一想法那便是两两计算,但是往往最简单的想法是不怎么靠谱的.下面用递归来解决.递归有一大好 ...

  4. C++中用辗转相除法求两个数的最大公约数和最小公倍数

    两个数的最大公约数:不能大于两个数中的最小值,算法口诀:小的给大的,余数给小的,整除返回小的,即最大公约数,(res=max%min)==0?  max=min,min=res return min; ...

  5. 求两个数的最大公约数(Euclid算法)

    求两个数 p 和 q 的最大公约数(greatest common divisor,gcd),利用性质 如果 p > q, p 和 q 的最大公约数 = q 和 (p % q)的最大公约数. 证 ...

  6. C++扬帆远航——14(求两个数的最大公约数)

    /* * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:gongyueshu.cpp * 作者:常轩 * 微信公众号:W ...

  7. Java数据结构与算法之---求两个数的最大公约数(欧几里得算法)

    一个简单的小算法来获取两个数的最大公约数, public class Test { public static void main(String[] args) { long result = gcd ...

  8. C实现辗转相除法求两个数的最大公约数

    什么是辗转相除法? 辗转相除法(又名欧几里德算法),它主要用于求两个正整数的最大公约数.是已知的最古老的算法. 用辗转相除法求132和72的最大公约数的步骤: 132 / 72 = 1 ... 60 ...

  9. 求两个数的最大公约数(Java)

    获得两个随机数(100以内),并放入数组中 public int[] getTwoRandom(){ int[] t = new int[2]; Random rand = new Random(); ...

随机推荐

  1. 理解面向消息的中间件和 JMS

    本章知识点: 企业消息和面向消息的中间件 理解 Java Message Service(JMS) 使用 JMS APIs 发送和接收消息 消息驱动 bean 的一个例子 简介 一般来说,掌握了企业级 ...

  2. 有关linux下redis overcommit_memory的问题,有需要的朋友可以参考下。

    我在安装redis-4.0.6后,启动时出现一些问题,如下: :M Jan ::! Background save may fail under low memory condition. To fi ...

  3. 有些事情不要强求 PS:日常收集语录

    有些事情不要强求 1.有些事,我们明知道是错的,也要去坚持,因为不甘心:有些人,我们明知道是爱的,也要去放弃,因为没结局:有时候,我们明知道没路了,却还在前行,因为习惯了. 2.以为蒙上了眼睛,就可以 ...

  4. wiredtiger引擎性能——比levelDB更牛叉!

    WE'VE JOINED MONGODB!   We're proud to announce that MongoDB has acquired WiredTiger, and we've join ...

  5. levelDB, TokuDB, BDB等kv存储引擎性能对比——wiredtree, wiredLSM,LMDB读写很强啊

    在:http://www.lmdb.tech/bench/inmem/ 2. Small Data Set Using the laptop we generate a database with 2 ...

  6. 【ORM】关于Dapper的一些常见用法

    引言 Dapper是.Net平台下一款小巧玲珑的开源Orm框架,简单实用的同时保持高性能,非常适合我这种喜欢手写SQL的人使用,下面介绍一下如何使用Dapper. 相关资料 Dapper的GitHub ...

  7. metaclass 了解一下

    创建类的两种方式 方式一: class Foo(object,metaclass=type): CITY = "bj" def func(self,x): return x + 1 ...

  8. Agc001_D Arrays and Palindrome

    传送门 题目大意 给定一个元素和为$N$的有$M$个数的序列$A$,请你可以$A$元素排列的顺序,并需要构造一个有$K$个($K$可以自己定)数的数列,使得任意一个长度为$N$的字符串,若满足:前$A ...

  9. UVA - 1331 Minimax Triangulation (区间dp)(最优三角剖分)

    题目链接 把一个多边形剖分成若干个三角形,使得其中最大的三角形面积最小. 比较经典的一道dp问题 设dp[l][r]为把多边形[l,r]剖分成三角形的最大三角形面积中的最小值,则$dp[l][r]=m ...

  10. CodeForces - 633H :Fibonacci-ish II(正解:莫对+线段树)

    Yash is finally tired of computing the length of the longest Fibonacci-ish sequence. He now plays ar ...