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亦互質。