1. 程式人生 > >讀了一點TAOCP.《計算機程式設計藝術》

讀了一點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;
}