辗转相除法求最大公约数

辗转相除法求最大公约数

设两数为a、b(b<a),求它们最大公约数(a,b)的步骤如下:用b除a,得a=bq......r1(0≤r)。若r1=0,则(a,b)=b;若r1≠0,则再用r1除b,得b=r1q......r2 (0≤r2).若r2=0,则(a,b)=r1,若r2≠0,则继续用r2除r1,……如此下去,直到能整除为止。其最后一个非零余数即为(a,b)。

从某处找的证明:

原理及其详细证明

  在介绍这个方法之前,先说明整除性的一些特点(下文的所有数都是正整数,不再重覆),我们可以这样给出整除性的定义:

  对于二个自然数a和b,若存在正整数q,使a=bq,则a能被b整除,b为a的因子,a为b的倍数。

  如果a能被c整除,并且b也能被c整除,则c为a、b的公因数(公有因数)。

  由此我们可以得出以下推论:

  推论1、如果a能被b整除(a=qb),若k为正整数,则ka也能被b整除(ka=kqb)

  推论2、如果a能被c整除(a=hc),b也能被c整除(b=tc),则(a±b)也能被c整除

  因为:将二式相加:a+b=hc+tc=(h+t)c 同理二式相减:a-b=hc-tc=(h-t)c

  所以:(a±b)也能被c整除

  推论3、如果a能被b整除(a=qb),b也能被a整除(b=ta),则a=b

  因为:a=qb b=ta a=qta qt=1 因为q、t均为正整数,所以t=q=1

  所以:a=b

辗转相除法是用来计算两个数的最大公因数,在数值很大时尤其有用,而且应用在电脑程式上也十分简单。其理论如下:

  如果 q 和 r 是 m 除以 n 的商及余数,即 m=nq+r,则 gcd(m,n)=gcd(n,r)。

  证明是这样的: 设 a=gcd(m,n),b=gcd(n,r)

  证明:

  ∵a为m,n的最大公约数,

  ∴m能被a整除,且n也能被a整除,

  ∴由推论1得:qn也能被a整除,

  ∴ 由推论2得:m-qn也能被a整除,

  又 ∵m-qn=r,

  ∴r也能被a整除,即a为n和r的公约数(注意:还不是最大公约数)

  ∵b为n和r的最大公约数,a为n和r的公约数

  ∴a≤b,

  同理

  ∵b为n, r的最大公约数,

  ∴n能被b整除,且r也能被b整除,

  ∴由推论1得:qn也能被b整除,

  ∴由推论2得:qn+r也能被b整除,

  又∵m=qn+r,

  ∴m也能被b整除,即b为m和n的公约数,(注意:还不是最大公约数)

  ∵a为m,n的最大公约数,b为m和n的公约数,

  ∴b≤a,

  由以上可知:

  a≤b与b≤a同时成立,

  故可得

  a=b,

  证毕。

时间: 2024-10-23 04:29:12

辗转相除法求最大公约数的相关文章

鸡兔同笼问题、百鸡问题、辗转相除法求最大公约数

一.鸡兔同笼 鸡和兔子35只,腿一共有94条,求出鸡和兔子的数量各是多少?(鸡的数目是23,兔子的数目是12) $n = 0; for($ i=1;$i<35;$i++){ $n ++; //n=34; $ j=35-i; if(i*2+j*4==94){ printf("鸡的数目是%d只, 兔子的数目是%d只",$i,$j); } } 此时,循环进行了34次.但是,有些循环是无意义的,因为得到了结果,循环还在继续往下执行.我们知道:两个未知数,两个方程,其方程组的解唯一!那么我

辗转相除法求最大公约数,非goto

1 #include<iostream> 2 using namespace std; 3 //不推荐用goto,当然用它更快 4 //辗转相除法求两数的最大公约数 5 int gcd(long int a,long int b){ 6 int x=a<b?a:b; 7 //获得较小者,用来做循环的约束值 8 9 for(int i=0;i<x;x++){ 10 //循环 11 if(a>b){ 12 int r=a%b;//取余数 13 if(r==0){//能否整除判断

辗转相除法求最大公约数------一行代码

今天学到一行代码,感觉好牛逼--------当然是老师上课讲的. 辗转相除法是求最大公约数最好的方式了吧! 辗转相除法原理我也不想多说,百度一下就可以了(基本就是用大数与小数取余,再用比余数大一点的数与余数取余, 反复直到出现余数为0,那个比0大一点的数就是最大公约数) 好了,废话不多说了------上代码 int gcd(int m, int n){ return n % m == 0 ? m : gcd(n%m, m); } 详细讲解一下: 优势是使用了递归,一直让大数与小数取余,直到出现0

辗转相除法求最大公约数和最小公倍数分析

求最大公约数和最小公倍数 程序分析: (1)最小公倍数=输入的两个数之积除于它们的最大公约数,关键是求出最大公约数: (2)求最大公约数用辗转相除法(又名欧几里德算法) 辗转相除法: #include<stdio.h> int main() { int a,b,c; int raw_a,raw_b; scanf("%d %d",&a,&b); raw_a=a;raw_b=b; c=a%b; while (c!=0) { a=b;b=c; c=a%b; } p

C辗转相除法求最大公约数的实现

int gcd(int a, int b)//求最大公约数,a为分子,b为分母 { if(b == 0) return a; return gcd(b,a%b); }

nyoj 189 兔子的烦恼(一)(辗转相除法求最大公约数)

题目189 题目信息 运行结果 本题排行 讨论区 兔子的烦恼(一) 时间限制:1000 ms  |  内存限制:65535 KB 难度:2 描述 在一座山上有n个山洞(每个洞从0~n-1分别编号),这山上有一只兔子躲在山洞里,有一只狼,从编号为0的山洞开始入洞,每隔m-1个洞,再次入洞抓兔子,现在问,兔子能否避免这场灾难? 例如:m=2 and n=6, 狼将要进入的山洞号为:0,2,4,0; 输入 有多组测试数据,不超过1000组; 每组有两个整数m,n(0<m,n<=1000); 注意:程

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

要求最小公倍数可先求出最大公约数 设要求两个数a,b的最大公约数 伪代码: int yushu,a,b: while(b不等于0) { yushu=a对b求余 b的值赋给a yushu的值赋给b } 代码: int gongyue() { int yushu,a,b; while(b) { yushu=a%b; a=b; b=yushu; } return b; } 此子函数可以求出两个数的最大公约数n    最小公倍数为a*b/n:

[算法]辗转相除法求最大公约数

辗转相除法用得比较多,今天Mark一下.具体做法就是:如果q和r分别是m除以n的商及余数,即m=nq+r,那么m和n的最大公约数等于n和r的最大公约数. 代码如下: public static int gcd(int m, int n) { return n == 0 ? m : gcd(n, m % n); }

c语言:辗转相除法求最大公约数、最小公倍数

辗转相除法,又称欧几里得算法.两个正整数a和b(a>b),它们的最大公约数等于余数c和较小的数b之间的最大公约数.最小公倍数=两数之积/最大公约数 #include <stdio.h>int get1(int a, int b){ if (a < b) { int c = a; a = b; b = c; } while (a%b != 0) { b = a%b; a = b; } return b;}int get2(int a,int b){ return a*b / get1