在數學中,輾轉相除法,又稱歐幾里得演算法(英語:euclidean algorithm),是求最大公約數的演算法。輾轉相除法首次出現於歐幾里得的《幾何原本》(第vii卷,命題i和ii)中,而在中國則可以追溯至東漢出現的《九章算術》。
輾轉相除法基於如下原理:兩個整數的最大公約數等於其中較小的數和兩數的差的最大公約數。
演算法的計算過程如下:
設k表示步驟數(從0開始計數)
每一步的輸入是都是前兩次計算的非負餘數rk1和rk2。因為每一步計算出的餘數都在不斷減小,所以,rk-1小於rk-2。在第k步中,演算法計算出滿足以下等式的商qk和餘數 rk:
rk2 = qk*rk1 + rk
其中0 ≤ rk < rk-1。也就是rk-2要不斷減去rk-1直到比rk-1小。
為求簡明,以下只說明如何求兩個非負整數a和b的最大公約數(負數的情況是簡單的)。在第一步計算時(k = 0),設r2和r1分別等於a和b,第2步(此時k = 1)時計算r−1(即b)和r0(第一步計算產生的餘數)相除產生的商和餘數,以此類推。
如果有a < b,演算法的第一步實際上會把兩個數字交換,因為這時a除以b所得的商q0會等於0,餘數r0則等於a。然後,演算法的第二步便是把b除以a,再計算所得之商和餘數。所以,對於k ≥ 0總有rk具體實現**如下:
//輾轉相除法
int c_commondivisor::div_alg(m_num1, m_num2)
return tmp2;
}
輾轉相減法(求最大公約數),即尼考曼徹斯法,其特色是做一系列減法,從而求得最大公約數。
不過,對於我來說感覺就是輾轉相除法的「減法」版。
具體實現如下:
//相減法
int c_commondivisor::phase_sub()
}return tmp2;
}
窮舉法即將所有的可能的結果從兩數之中小的那個數開始,依次減1,然後帶入進行驗證是否滿足被兩數相除餘數為0,若是找到符合的第乙個數字,則即為最大公約數,可以說是最沒有效率也是最暴力的辦法。
具體實現如下:
//窮舉法
int c_commondivisor::exhaustion()
} return i;
}
所有具體的**如下:
編譯執行環境為visual studio 2017
//
//檔名 : commondivisor.cpp
//建立者 : el.gou
//建立日期 : 2017.03.21
//開發環境 : visual studio 2017
//#include using namespace std;
class c_commondivisor ;
c_commondivisor::c_commondivisor()
//獲得輸入函式
int c_commondivisor::input()
return 0;
}//輸出結果函式
int c_commondivisor::output(int i)
else if (i == 3)
else
cout << "的最大公約數為:" << m_result << "\n\n\n\n\n\n" << endl;
return 0;
}//選單函式
int c_commondivisor::mainmenu()
else if (tmp == 2)
else if (tmp == 3)
else if (tmp == 0)
else
//依據計算輸出相應的計算方式及結果
output(tmp);
} return 0;
}//輾轉相除法
int c_commondivisor::div_alg()
return tmp2;
}//相減法
int c_commondivisor::phase_sub()
} return tmp2;
}//窮舉法
int c_commondivisor::exhaustion()
} return i;
}int main(int argc,char** argv)
與以上演算法相比,在進行非常大的數字的最大公約數計算時,stein演算法是更有效率的演算法,具體演算法概念及流程可以參考:
參考資料:wikipedia
最大公約數
1.執行最大公約數的常用演算法,並新增異常處理模組 如輸入非法等 在基礎程式的基礎上,可以考慮手動輸入所有數字或者利用隨機數產生數字,分別加入異常處理模組。注 隨機數的產生方法 srand 的作用是提供乙個種子。然後呼叫rand 其格式為int rand void 它會根據提供給srand 的種子值...
最大公約數
最大公因數 greatest common divisor 也稱最大公約數 最大公因子,指兩個或多個整數共有約數中最大的乙個。a,b的最大公約數記為 a,b 同樣的,a,b,c的最大公約數記為 a,b,c 多個整數的最大公約數也有同樣的記號。求最大公約數有多種方法,常見的有質因數分解法 短除法 輾轉...
最大公約數
求兩數的最大公約數 簡單嗎?簡單!用多種方法求,可以嗎?emmmmm.應該可以吧?相信絕大多數人都知道求最大公約數的如下 所示的這種方法 include includeint commondivisor int x,int y min return min int main 先判斷兩個數的大小,將較...