青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

/*
  Name: 楊輝三角算法集錦
  Copyright: 始發于goal00001111的專欄;允許自由轉載,但必須注明作者和出處
  Author: goal00001111
  Date: 27-11-08 19:04
  Description:
  分別使用了二維數組,一維數組,隊列,二項式公式,組合公式推論和遞歸方法等9種算法
  算法思路詳見代碼注釋——注釋很詳細,呵呵
*/
#include<iostream>
#include<iomanip>

using namespace std;

const int MAXROW = 40;

void PrintBlank(int n);
int Com(int n, int m);
int Try(int row, int cel);
void Fun_1(int row);
void Fun_2(int row);
void Fun_3(int row);
void Fun_4(int row);
void Fun_5(int row);
void Fun_6(int row);
void Fun_7(int row);
void Fun_8(int row);
void Fun_9(int row);

int main()
{
    int row;
    cin >> row;
   
    Fun_1(row);
    cout << endl;
    Fun_2(row);
    cout << endl;
    Fun_3(row);
    cout << endl;
    Fun_4(row);
    cout << endl;
    Fun_5(row);
    cout << endl;
    Fun_6(row);
    cout << endl;
    Fun_7(row);
    cout << endl;
    Fun_8(row);
    cout << endl;
    Fun_9(row);

    system("pause");
    return 0;
}

//輸出n個空格
void PrintBlank(int n)
{
    for (int i=0; i<n; i++)
        cout << ' ';
}

//使用二維數組輸出楊輝三角
void Fun_1(int row)
{
    const int DIS = 6;
    int blank = 32;
    int a[MAXROW][MAXROW] = {0};
   
    for (int i=0; i<row; i++)
    {
        PrintBlank(blank-=DIS/2);//輸出第i行空格
        for (int j=0; j<=i; j++)
        {
            if (j == 0 || j == i)
                a[i][j] = 1;
            else //規律: 左上與正上元素之和
                a[i][j] = a[i-1][j-1] + a[i-1][j];
           
            cout << setw(DIS) << a[i][j];
            if (j == i)
                cout << endl;
        }
    }
}
//使用隊列輸出楊輝三角
void Fun_2(int row)
{
    const int DIS = 6;
    int max = row + 2;
    int blank = 30;
    int *a = new int[max];
    int front, rear;
   
    front = 0; a[0] = 1;
    rear  = 1; a[1] = 1;
    PrintBlank(blank);//輸出第一行空格

    while (front != (rear+1)%max)
    {
        if (a[front] == 1 && a[(front+1)%max] == 1)//到i-1行尾部
        {
            rear = (rear+1)%max; a[rear] = 1; //第i行尾部
            rear = (rear+1)%max; a[rear] = 1; //隊尾進入第i+1行
            cout << setw(DIS) << 1 << endl;            //輸出第i-1行尾部
            front = (front+1)%max;            //對頭進入第i行
            PrintBlank(blank-=DIS/2);//輸出第i行空格
        }
        //處理中間數據
        rear = (rear+1)%max; a[rear] = a[front] + a[(front+1)%max];
        if (front != rear)//隊列非空時輸出
            cout << setw(DIS) << a[front]; //輸出對頭
        front = (front+1)%max; //刪除對頭元素
    }
    delete []a;
}

//使用兩個一維數組代替二維數組輸出楊輝三角
void Fun_3(int row)
{
    const int DIS = 6;
    int blank = 33;
    int *a = new int[row]; //存儲下一行
    int *b = new int[row];//存儲輸出行
   
    b[0] = 1; 
    for (int n=1; n<=row; n++)
    {
        //輸出第n行
        PrintBlank(blank-=DIS/2);
        for (int i=0; i<n; i++)
            cout << setw(DIS) << b[i];
        cout << endl;
       
        if (n == row)//已經到最后一行則不再復制
            continue;
        //生成第n+1行數據
        a[0] = b[0];
        for (int i=1; i<n; i++)
            a[i] = b[i] + b[i-1];
        a[n] = 1;
        //復制第n+1行數據
        for (int i=0; i<=n; i++)
            b[i] = a[i];
    }
    delete []a;
    delete []b;
}

//使用一個一維數組和兩個臨時變量代替二維數組輸出楊輝三角:很巧妙
void Fun_4(int row)
{
    const int DIS = 6;
    int blank = 30;
    int *a = new int[row]; //存儲輸出行
    int left, right;  
    //輸出第一行
    PrintBlank(blank);//輸出第1行空格
    cout << setw(DIS) << 1 << endl;
 
    a[0] = 1;//左側數據永遠為1
    for (int n=1; n<row; n++)
    {
        left = a[0];
        //生成第n行數據
        for (int i=1; i<n; i++)//設置中間數據
        {
            right = a[i];
            a[i] = left + right;//left=a[i-1],right=a[i]
            left = right;
        }
        a[n] = 1;//設置右側的數據1
        //輸出第n行
        PrintBlank(blank-=DIS/2);
        for (int i=0; i<=n; i++)
            cout << setw(DIS) << a[i];
        cout << endl;
    }
    delete []a;
}


//使用一個一維數組和兩個臨時變量代替二維數組輸出楊輝三角:方法同Fun_4,但更具有技巧,有點難懂
void Fun_5(int row)
{
    const int DIS = 6;
    int blank = 33;
    int *a = new int[row]; //存儲輸出行
    for (int i=1; i<row; i++)//賦初值0,這個很重要,因為后面有用到
       a[i] = 0;
      
    a[0] = 1; 
    int left, right;
    for (int n=1; n<=row; n++)
    {
        left = 0;
        //生成第n行數據
        for (int i=0; i<n; i++)
        {
            right = a[i];
            a[i] = left + right;//left=a[i-1],right=a[i]
            left = right;
        }
        //輸出第n行
        PrintBlank(blank-=DIS/2);
        for (int i=0; i<n; i++)
            cout << setw(DIS) << a[i];
        cout << endl;
    }
    delete []a;
}

//使用一個一維數組輸出楊輝三角;兩側的1不變,計算中間的元素
void Fun_6(int row)
{
    const int DIS = 6;
    int blank = 30;
    int *a = new int[row];
   
     //輸出第一行
    PrintBlank(blank);//輸出第1行空格
    cout << setw(DIS) << 1 << endl;
   
    a[0] = 1;//最左側為1,永遠不變
    for (int n=1; n<row; n++)
    {
        a[n] = 1; //設置最右側的1
        for (int i=n-1; i>0; i--)//設置中間的元素,由于a[i]的值變化,故應從右到左計算
        {
            a[i] += a[i-1]; //楊輝三角的規律
        }
        //輸出第n+1行
        PrintBlank(blank-=DIS/2);
        for (int i=0; i<=n; i++)
            cout << setw(DIS) << a[i];
        cout << endl;
    }
    delete []a;
}

//使用二項式定理輸出楊輝三角
void Fun_7(int row)
{
    const int DIS = 6;
    int blank = 30;
   
    //輸出第一行
    PrintBlank(blank);//輸出第1行空格
    cout << setw(DIS) << 1 << endl;
   
    for (int i=1; i<row; i++)
    {
        PrintBlank(blank-=DIS/2);//輸出第i行空格
        for (int j=0; j<i; j++)
        {
            cout << setw(DIS) << Com(i, j);
        }
        cout << setw(DIS) << 1 << endl;//輸出每行最后一個1
    }
}

//輸出組合c(n,m)
int Com(int n, int m)
{
    int s1 = 1;
    int s2 = 1;
    m = (m > n/2) ? (n - m) : m;//取小的,以減少計算量

    for (int i=1; i<=m; i++)
    {
        s1 *= n;
        s2 *= i;
        if (s1 % s2 == 0)//防止溢出
        {
            s1 /= s2; 
            s2 = 1;
        }
        n--;
    }
    return s1;
}

//使用組合公式推論輸出楊輝三角 :C(n,m) = (n-m+1)/m * C(n,m-1)
void Fun_8(int row)
{
    const int DIS = 6;
    int blank = 30;
   
    //輸出第一行
    PrintBlank(blank);//輸出第1行空格
    cout << setw(DIS) << 1 << endl;
    for (int n=1; n<row; n++)
    {
        int c = 1;
        PrintBlank(blank-=DIS/2);//輸出第i行空格
        cout << setw(DIS) << c; //輸出每行第一個1
        for (int m=1; m<n; m++)//輸出中間元素
        {
            c = c * (n - m + 1) / m;
            cout << setw(DIS) << c;
        }
        cout << setw(DIS) << 1 << endl;//輸出每行最后一個1
    }
}

//使用遞歸方法輸出楊輝三角 :C(n,k) = 1 (k=0或者n=k);C(n,k) = C(n-1,k-1) + C(n-1,k)
void Fun_9(int row)
{
    const int DIS = 6;
    int blank = 33;

    for (int n=0; n<row; n++)
    {
        PrintBlank(blank-=DIS/2);//輸出第i行空格
        for (int m=0; m<=n; m++)//輸出中間元素
        {
            cout << setw(DIS) << Try(n, m);
        }
        cout << endl;//輸出每行最后一個1
    }
}

//遞歸函數,輸出楊輝三角 :C(n,k) = 1 (k=0或者n=k);C(n,k) = C(n-1,k-1) + C(n-1,k)
int Try(int n, int k)
{
    if (k == 0 || k == n)//在左右兩側返回1
        return 1;
    return Try(n-1,k-1) + Try(n-1,k);//遞推公式 
}
Posted on 2008-11-27 19:12 夢想飛揚 閱讀(3196) 評論(2)  編輯 收藏 引用

Feedback

# re: 楊輝三角算法集錦   回復  更多評論   

2008-11-28 11:48 by zuhd
看了你的Fun_1,Fun_2,我就不想朝下看了

# re: 楊輝三角算法集錦   回復  更多評論   

2009-04-10 14:27 by zouzhi
很好啊,可以引發多種思路。我那個隊列還是不大懂啊
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美激情一区二区三区在线视频 | 一本色道久久综合亚洲91| 久久久水蜜桃| 久久尤物电影视频在线观看| 久久嫩草精品久久久精品| 久久成人精品| 免费在线亚洲欧美| 欧美激情一区在线| 9人人澡人人爽人人精品| 亚洲午夜精品久久久久久浪潮| 亚洲一区999| 欧美在线观看你懂的| 老色批av在线精品| 欧美视频你懂的| 国产字幕视频一区二区| 亚洲国产精品小视频| 亚洲视频高清| 久热精品视频在线观看一区| 久久久精品免费视频| 久久免费少妇高潮久久精品99| 欧美精品观看| 国产日韩欧美视频在线| 亚洲丶国产丶欧美一区二区三区| 妖精视频成人观看www| 欧美在线播放视频| 亚洲福利在线看| 亚洲视频在线一区| 久久亚洲一区二区| 国产精品你懂的| 亚洲人成毛片在线播放| 欧美一二三区在线观看| 亚洲激情成人网| 久久精品一二三| 国产精品亚洲欧美| 一区二区三区日韩欧美| 久久免费国产| 亚洲一级二级| 欧美日韩精品福利| 亚洲国产精品成人| 欧美一区二区三区婷婷月色| 亚洲日本中文字幕区| 久久久www免费人成黑人精品 | 在线性视频日韩欧美| 久久中文字幕一区二区三区| 一区二区三区四区国产精品| 男女激情久久| 激情文学综合丁香| 久久狠狠亚洲综合| 亚洲一区免费| 国产精品免费网站在线观看| 夜夜嗨av一区二区三区中文字幕 | 欧美在现视频| 中文精品视频| 欧美视频网址| 一区二区欧美精品| 亚洲欧洲一区二区三区久久| 麻豆av一区二区三区| 黑丝一区二区| 久久久久久一区二区| 欧美一区二区在线免费播放| 国产精品一区久久久| 午夜久久美女| 亚洲欧美日韩成人| 国产日韩欧美自拍| 久久精品观看| 久久久久久久综合狠狠综合| 伊人激情综合| 欧美激情综合色| 欧美国产日本在线| 老色批av在线精品| 亚洲精品欧美极品| 亚洲日本一区二区三区| 欧美日韩在线三区| 午夜精品一区二区三区四区 | 欧美福利电影网| 亚洲国产专区| 亚洲欧洲综合| 欧美性天天影院| 欧美在线在线| 久久综合九色综合网站| 亚洲精品国产拍免费91在线| 亚洲人成在线观看| 国产精品成人观看视频免费 | 欧美激情导航| 欧美人成网站| 先锋影音一区二区三区| 久久精品视频免费观看| 亚洲激情一区二区| 一区二区三区视频在线播放| 合欧美一区二区三区| 亚洲激情自拍| 国产视频一区在线| 亚洲国产日韩美| 国产欧美日韩综合一区在线观看| 欧美成年人视频网站| 欧美日韩一区二区高清| 久久久国产精品亚洲一区| 欧美成人资源| 欧美自拍偷拍| 欧美三区视频| 欧美成人免费大片| 国产乱码精品一区二区三| 亚洲第一搞黄网站| 国产日韩在线看片| 亚洲精品色图| 在线成人亚洲| 午夜视频久久久| 一区二区三区欧美视频| 久久久五月婷婷| 亚洲免费一在线| 欧美福利小视频| 久久亚洲春色中文字幕久久久| 欧美日韩激情网| 欧美www视频| 国产偷国产偷亚洲高清97cao| 亚洲精品黄色| 亚洲欧洲精品一区二区三区| 欧美伊人久久| 午夜宅男久久久| 国产精品白丝av嫩草影院| 亚洲韩国精品一区| 在线成人免费观看| 久久精品国产v日韩v亚洲| 午夜精品在线| 国产精品你懂的在线| 亚洲毛片一区二区| 亚洲精品在线观看视频| 久久综合九色综合网站| 国产精品久久看| 日韩视频免费观看高清在线视频| 伊人男人综合视频网| 亚洲免费在线| 欧美在线一级va免费观看| 国产精品美女www爽爽爽视频| 亚洲三级色网| 一本久久a久久精品亚洲| 欧美激情aⅴ一区二区三区| 亚洲第一网站免费视频| 亚洲大胆人体视频| 久久伊人一区二区| 欧美1区2区| 亚洲人被黑人高潮完整版| 久久躁日日躁aaaaxxxx| 亚洲第一福利社区| 日韩一级大片在线| 欧美日韩另类视频| 99精品视频网| 欧美一区二区三区在线观看| 国产欧美日本在线| 久久精品视频在线播放| 理论片一区二区在线| 在线精品视频一区二区| 免费观看久久久4p| 99精品99| 久久国产精品一区二区三区| 国产在线欧美日韩| 免费日韩成人| 亚洲毛片一区| 欧美一区亚洲| 亚洲国产精品一区二区第四页av | 亚洲国产日韩综合一区| 一本久久综合亚洲鲁鲁五月天| 欧美激情一区二区三区在线视频| 99re66热这里只有精品4| 先锋亚洲精品| 亚洲福利视频一区| 国产精品国产三级国产 | 亚洲国产精品久久91精品| 一区二区三区毛片| 国产欧美欧洲在线观看| 久久久99免费视频| 亚洲老司机av| 久久色在线播放| 亚洲视屏在线播放| 极品尤物av久久免费看| 欧美精品免费播放| 久久国产欧美| 艳妇臀荡乳欲伦亚洲一区| 久久久久女教师免费一区| 99热这里只有精品8| 国产精品一区二区三区久久久 | 这里只有精品在线播放| 久久米奇亚洲| 一本久久精品一区二区| 狠狠综合久久av一区二区老牛| 欧美精品免费在线| 久久高清国产| 在线亚洲免费视频| 欧美成人免费一级人片100| 国产精品亚洲激情| 欧美**人妖| 欧美一区二区日韩| 日韩视频在线观看一区二区| 老司机成人在线视频| 欧美亚洲一区三区| 正在播放亚洲一区| 亚洲国产影院| 亚洲高清免费在线| 激情久久五月| 国产在线观看精品一区二区三区|