一、展轉相除法求最大公約數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亦互質。