辗转相除法的实现

辗转相除法基于如下原理:两个整数的最大公约数等于其中较小的数和两数的相除余数的最大公约数。
#include<stdio.h>

//使用辗转相除法求最大公约数
int gcd(int a, int b)
{
if (a % b == 0)
{
printf("%d",b);
}
else
{
return gcd(b, a%b);
}
}
int main (void)
{
gcd(8,6);//测试8,6的最大公约数,默认a>b
}

时间: 2024-10-16 21:58:41

辗转相除法的实现的相关文章

hdu1722 bjfu1258 辗转相除法

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

辗转相除法

辗转相除法(欧几里得算法)是求最大公约数的算法,首先用较大的数除以较小的数,求得商与余数,把余数作为除数,即用原来的除数除以余数,求得商与余数.以此类推,直到余数为零时,除数即为原来两数的最大公约数. 一.递归算法 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 二.循环版本

[转]辗转相除法 的 证明

挑战上的没有看特别懂 所以从网上搜索了下  感觉能看懂 辗转相除法的证明 设两数为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