讀了一點TAOCP.《計算機程式設計藝術》
學校的新圖書館開門了,看到了不少好書,尤其是兩本我一直瞻仰的好書 :《計算機程式設計藝術》TAOCP和程式設計珠璣。遂開始了我的讀書計劃,每天讀一張TAOCP,也就是採用CR閱讀法,每天一點點,不計算我能讀完的那一天,力求能夠多讀一點。
前幾天讀完了1.1節,說是讀完了,其實最後的Knuth大神用集合論證明演算法那段看不動,跳過。我也就是隻能把書中的歐幾里得演算法1.1E用C++寫了出來,包括習題中那個歐幾里得演算法演算法F,除錯了一下,效率果然是好了不少。習題中的演算法F雖很小,但我實在是想不出來~~
附上演算法1.1E和1.1F及我寫的C++原始碼:
1.1E: (歐幾里得演算法)給定兩個正整數m和n,求它們的最大公因子.
E1: [求餘數]以n除m並令r為所得餘數.
E2: [餘數為0?]若r=0,演算法結束,n即為答案.
E3: [減少]置m<-n,n<-r,並返回E1.
C++:
//TAOCP:1.1E(歐幾里得演算法)求兩個正整數的最大公約數
#include
using namespace std;
int main()
{
int m,n;//兩個正整數
int r;//餘數
cout<<"請輸入兩個正整數:"< cin>>m>>n;
while(0!=(r=m%n))//求餘數並判斷是否為0
{
m=n;
n=r;
}
cout<<"兩個正整數的最大公約數是: "<
return 0;
}
演算法F:(歐幾里得演算法)給定兩個正整數m和n,求它們的最大公因子.提高效率
F1: [餘數為m/n]以n除m並令m是餘數.
F2: [它為0?]如果m=0,則此演算法結束以n為答案而終止.
F3: [餘數為n/m]以m除n並令n是餘數.
F4: [它為0?]如果n=0,則此演算法結束以答案m而終止,否則返回F1.
C++:
//TAOCP:1.1F(習題,改編歐幾里得演算法)
//求兩個正整數的最大公約數,要求不使用替換(如m=n)
#include
using namespace std;
int main()
{
int m,n;//兩個正整數
bool tag;
int count = 1;//記錄迴圈次數
cout<<"請輸入兩個正整數:"< cin>>m>>n;
while(1)
{
count++;
m = m % n;
if(m == 0)
{
tag = 1; break;
}
n = n % m;
if(n == 0)
{
tag = 0; break;
}
}
cout<<"兩個正整數的最大公約數是: "<<(tag == 1 ? n : m)< cout<
return 0;
}