1、辗转相除法求最大公约数
int a, b, c;
printf("请输入两个整数(逗号隔开):");
scanf("%d,%d", &a, &b);
c = a%b;
while (c != 0)
{
a = b;
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亦互质。