輾轉相除法:設兩數為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...