辗转相除法

辗转相除法(欧几里得算法)是求最大公约数的算法,首先用较大的数除以较小的数,求得商与余数,把余数作为除数,即用原来的除数除以余数,求得商与余数。以此类推,直到余数为零时,除数即为原来两数的最大公约数。

一.递归算法

1 function gcd(a, b)
2    if a<b
3      swap(a,b); //交换a,b的值  
4    if b==0
5      then return a;
6    else
7      return gcd(b, a mod b); //mod函数为求余函数相当于%
8  end

二.循环版本

 1 function gcd(a,b)
 2    if a<b
 3      then swap(a,b);
 4    while(b!=0)
 5    {
 6      c = a mod b;
 7      a = b;
 8      b = c;
 9    }
10    return a;
11  end
时间: 2024-08-25 06:37:59

辗转相除法的相关文章

hdu1722 bjfu1258 辗转相除法

这题就是个公式,代码极简单.但我想,真正明白这题原理的人并不多.很多人只是随便网上一搜,找到公式a了就行,其实这样对自己几乎没有提高. 鉴于网上关于这题的解题报告中几乎没有讲解原理的,我就多说几句,也不是严格的证明,给大家分享一下. 题目是说有p人或q人吃蛋糕,需要提前把蛋糕切好而能同时满足这两种情况,使蛋糕的块数最少.为了方便表述,不妨设p < q 首先,记p和q的最小公倍数为m,则把蛋糕平均切成m块,一定是能满足条件的,但这不是最优解,暂记为解法①. 我们的工作就是把解法①的这m块中的一些尽

[转]辗转相除法 的 证明

挑战上的没有看特别懂 所以从网上搜索了下  感觉能看懂 辗转相除法的证明 设两数为a.b(b<a),求它们最大公约数的步骤如下:用b除a,得a=bq+r(0≤r<b)(q是这个除法的商). 若r=0,则b是a和b的最大公约数. 若r≠0,则继续考虑. 首先,应该明白的一点是任何 a 和 b 的公约数都是 r 的公约数.要想证明这一点,就要考虑把 r 写成 r=a-bq.现在,如果 a 和 b 有一个公约数 d,而且设 a=sd , b=td, 那么 r = sd-tdq = (s-tq)d.因

欧几里得算法(辗转相除法)

欧几里德算法又称辗转相除法,用于计算两个整数a,b的最大公约数. 基本算法:设a=qb+r,其中a,b,q,r都是整数,则gcd(a,b)=gcd(b,r),即gcd(a,b)=gcd(b,a%b). 第一种证明: a可以表示成a = kb + r,则r = a mod b 假设d是a,b的一个公约数,则有 d|a, d|b,而r = a - kb,因此d|r 因此d是(b,a mod b)的公约数 假设d 是(b,a mod b)的公约数,则 d | b , d |r ,但是a = kb +r

【辗转相除法】求最大公约数和最小公倍数

#include<stdio.h>  void main()   /*  辗转相除法求最大公约数 */   {      int m,n,a,b,t,c;      scanf("%d%d",&a,&b);     m=a;    n=b;     while(b!=0)  /* 余数不为0,继续相除,直到余数为0 */      {    c=a%b;    a=b;     b=c;   }     printf("%d\n", a)

ACM 辗转相除法(求最大公约数 )

Description There is a hill with n holes around. The holes are signed from 0 to n-1. A rabbit must hide in one of the holes. A wolf searches the rabbit in anticlockwise order. The first hole he get into is the one signed with 0. Then he will get into

求两个数的最大公约数(辗转相除法)

#include <stdio.h> int main() {    int num1,num2;    printf("请输入两个整数:");    scanf("%d%d",&num1,&num2);    while(num1%num2)    {       int r=num1%num2;//运用辗转相除法       num1=num2;       num2=r;    }    printf("%d\n"

【C语言】最大公约数(更相减损法)和(辗转相除法)

#include<stdio.h> #include <math.h> /* 编写一个函数,传入a,b两个int类型的变量,返回两个值的最大公约数. 例如:输入传入(0 , 5)函数返回5,传入(10 , 9)函数返回1,传入(12 , 4)函数返回4 */ //更相减损法 int fuc(int m,int n) { int i=0,temp,x; while(m%2==0 && n%2==0) //判断m和n能被多少个2整除 { m/=2; n/=2; i+=1

辗转相除法求H.C.F小结

辗转相除法 大纲: 问题 原理 反思 1.     问题 一个试题,请完成以下填空 下列程序是利用辗转相除法求H.C.F(最大公约数) 1 include <stdio.h> 2 3 int main(){ 4 5 int m,n,r; 6 7 scanf("%d%d",&m,&n); 8 9 r=[?1]; 10 11 while([?2]){ 12 13 m=[?3];n=r;r=[?4]; 14 15 printf("h.c.f is %d&

最大公约数(gcd)和 最小公倍数(lcm)——辗转相除法

辗转相除法(又称欧几里得算法)是求最大公因数的算法 要求a,b的最大公约数(a>b),我们可以递归地求b,a%b的最大公约数,直到其中一个数变成0,这时另一个数就是a,b的最大公约数. C++实现: int gcd(int a,int b){ retuen b?gcd(b,a%b):a; } 或: while(b!=0)  {  temp=a%b;   a=b;   b=temp; } 证明:(引自百度百科) 设两数为a.b(b<a),用gcd(a,b)表示a,b的最大公约数,r=a (mod