c 輾轉相除類題目

2021-09-29 11:23:42 字數 926 閱讀 9206

輾轉相除法:設兩數為a、b(a>b),求a和b最大公約數(a,b)的步驟如下:用b除a,得a=bq…r1(0≤r1)。若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)

1.求最小公倍數

思路:先用輾轉相除法求出最大公約數,然後求得公倍數

#include

using

namespace std;

intmain()

cout << a * b / r << endl;

}

2.取石子問題

有兩堆石子,兩個人輪流去取.每次取的時候,只能從較多的那堆石子裡取,並且取的數目必須是較少的那堆石子數目的整數倍.最後誰能夠把一堆石子取空誰就算贏.

思路:假設石子數目為(a,b)且a>=b,分為三種情況

(1)[a/b]>=2則先手必勝

(2)a%b==0則先手必勝

(3)否則,遞迴,直到遇到以上兩種情況。注意,此時的返回值是相反的

#include

using

namespace std;

bool

iswin

(int a,

int b)

else

if(a % b ==0)

else

//石子數目為(a,b)且a>=b,如果a小於b的兩倍,則遞迴判斷

return

!iswin

(b,a - b);}

intmain()

else cout <<

"lose"

<< endl;

}}

輾轉相除法原理

輾轉相除法原理 假設有兩個數x和y,存在乙個最大公約數z x,y 即x和y都有公因數z,那麼x一定能被z整除,y也一定能被z整除,所以x和y的線性組合mx ny也一定能被z整除。m和n可取任意整數 對於輾轉相除法來說,思路就是 若x y,設x y n餘c,則x能表示成x ny c的形式,將ny移到左...

約分 輾轉相除法

include using namespace std int main int temp1 int temp2 cin temp1 temp2 int a temp1 int b temp2 while b 0 int temp a b a b b temp cout 輾轉相除法 輾轉相除法是求兩...

模板 輾轉相除法

處理最大公因數時十分好用 但是我證不出來。gcd a,b gcd b,a mod b b 0 設兩數為a b a b 用gcd a,b 表示a,b的最大公約數,r a mod b 為a除以b的餘數,k為a除以b的商,即a b kr。輾轉相除法即是要證明gcd a,b gcd b,r 第一步 令c g...