一、展转相除法求最大公约数spa
int a, b, c;io
printf("请输入两个整数(逗号隔开):");基础
scanf("%d,%d", &a, &b);gc
c = a%b;while
while (c != 0)co
{gcd
a = b;printf
b = c;
c = a%b;
}
互质是公约数只有1的两个整数,叫作互质整数(非负)。公约数只有1的两个天然数,叫作互质天然数(即指非负整数。)后者是前者的特殊情形。
【公约数和公倍数都是针对整数而言的!!】
展转相除法证实叙述:
a和b两个正整数,若是a>b
a/b .… …. 余数为R1
b/R1 .… …. 余数为R2
R1/R2 .… …. 余数为R3
R2/R3 ..… ….余数为R4
…. ….
R(n-2)/R(n-1)……余数为Rn
当Rn为零的时候,R(n-1)必定是最大公约数。
展转相除法证实须要证实知足两个条件:
已知条件:a和b两个正整数,若是a>b,且a/b=0,则a和b的最大公约数必定为b。
第一个条件证实:
为何Rn最后必定会等于0?
缘由1:
任意两个数,能够是同奇同偶/以奇一偶,展转相除法,主要是除数和余数的计算
同偶,在展转相除过程当中,余数必为偶数。最终余数会变为2,从而任意一个数都/能够被2整除
同奇,则展转相除过程当中,余数必为偶数。最终余数会变为1,从而任意一个数均可以被1整除
一奇一偶,展转过程当中,余数必为奇数,最终会变为1 ,从而任意一个数均可以被1整除
缘由2:
由于余数都要小于除数,
随着展转相除的进行,除数和余数愈来愈小,
为什么展转相除法到最后余数必定为0
而每一次的除数又分别等于上一次的余数,因此,总有那么一个时刻,余数会等于0。
第二个条件证实:
为何a/b和b/R1和R2/R3和R(n-2)/R(n-1)的最大公约数相等?
设两数为a、b(a>b),用gcd(a,b)表示a,b的最大公约数,r=a (mod b) 为a除以b的余数,k为a除以b的商,即a÷b=k.......r。展转相除法便是要证实gcd(a,b)=gcd(b,r)。
第一步:令c=gcd(a,b),则设a=mc,b=nc //设c为最大公约数,则m和n必定互质
第二步:根据前提可知r =a-kb=mc-knc=(m-kn)c //r也有公约数c,若是r=(m-kn)c和b=nc两个表达式中,m-kn和n是互质,就能够证实c也是r和b的最大公约数
第三步:假设m-kn与n非互质,而有一个公约数d,则有m-kn=xd,n=yd (d>1),则有m=kn+xd=kyd+xd=(ky+x)d,从而有a=mc=(ky+x)cd,b=nc=ycd,此时就会出现a与b的一个公约数cd>c,以前咱们的定义中c是a与b的最大公约数,此时与前面的假设矛盾,因此m-kn与n必定互质!所以c也是b与r的最大公约数。
从而可知gcd(b,r)=c,继而gcd(a,b)=gcd(b,r)。
证毕。
以上步骤的操做是创建在刚开始时r≠0的基础之上的。即m与n亦互质。