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

/*
  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>
            一本色道久久99精品综合| 久久精品视频在线观看| 国产精品试看| 国产精品美女黄网| 国产精品亚洲综合一区在线观看| 国产精品久久久久久久久久久久久 | 亚洲夜晚福利在线观看| 亚洲一区久久| 久久久久久久久久久久久9999| 久久在线视频| 亚洲精品一区二区三区四区高清 | 欧美成人免费全部观看天天性色| 欧美xxx成人| 欧美日韩免费观看一区=区三区| 国产精品久久二区| 黄色成人91| 亚洲无限乱码一二三四麻| 欧美影院视频| 亚洲欧洲日本国产| 亚洲一二三区精品| 久久免费视频网站| 欧美视频一区二区| 一区久久精品| 亚洲欧美日本国产有色| 老司机精品导航| 一本色道久久综合亚洲精品不卡 | 亚洲伦理久久| 久久精品最新地址| 亚洲精品一区二区三区婷婷月| 日韩视频精品在线| 欧美午夜视频一区二区| 怡红院av一区二区三区| 亚洲无限乱码一二三四麻| 久久婷婷国产综合精品青草| 这里只有精品电影| 欧美顶级大胆免费视频| 国产精品每日更新| 亚洲最新色图| 免费在线欧美黄色| 亚洲免费在线播放| 国产精品成av人在线视午夜片| 在线看无码的免费网站| 久久精品夜色噜噜亚洲a∨| 中日韩男男gay无套| 欧美黄色精品| 亚洲国产精品www| 另类av一区二区| 久久精品国产精品| 国产亚洲高清视频| 欧美在线亚洲一区| 宅男噜噜噜66一区二区| 欧美日韩在线综合| 亚洲一区二区三区成人在线视频精品 | 亚洲在线一区二区| 日韩系列欧美系列| 欧美日韩另类视频| 亚洲一区视频在线| 亚洲伊人久久综合| 国产精品三级久久久久久电影| 在线中文字幕不卡| 99视频在线精品国自产拍免费观看| 欧美不卡一卡二卡免费版| 18成人免费观看视频| 美女视频一区免费观看| 另类天堂视频在线观看| 亚洲国产精品va| 亚洲国产日韩欧美在线图片| 免费短视频成人日韩| 亚洲精品乱码久久久久久久久| 亚洲国产精品高清久久久| 欧美激情1区2区3区| 夜夜嗨av一区二区三区网站四季av | 欧美激情一区| 一本高清dvd不卡在线观看| 亚洲每日在线| 国产欧美一区二区三区久久人妖| 久久福利一区| 久久美女性网| 亚洲美女福利视频网站| 日韩视频一区二区三区| 亚洲日韩第九十九页| 久久夜色精品一区| 亚洲视频一二| 在线看国产日韩| 一本色道久久综合亚洲二区三区| 国产精品视频不卡| 久久午夜精品一区二区| 欧美久久电影| 久久久精品性| 欧美激情一区二区三区在线视频| 一区二区三区精密机械公司| 亚洲免费在线电影| 亚洲国产三级网| 亚洲视频图片小说| 一区二区三区在线视频免费观看| 亚洲国产福利在线| 国产精品网站视频| 亚洲国产欧美一区二区三区久久 | 久久综合久久综合这里只有精品 | 美女日韩欧美| 欧美一区二区三区精品 | 亚洲一区二区三区四区五区午夜| 永久91嫩草亚洲精品人人| 日韩亚洲国产精品| 一色屋精品视频免费看| 在线综合+亚洲+欧美中文字幕| 狠狠综合久久| 亚洲婷婷综合久久一本伊一区| 亚洲国产成人av好男人在线观看| 99国产精品国产精品久久| 亚洲电影免费观看高清完整版在线| 一本色道久久88综合日韩精品 | 国产日产高清欧美一区二区三区| 亚洲区一区二| 亚洲第一精品夜夜躁人人爽| 午夜视频久久久| 亚洲欧美日韩在线高清直播| 欧美精品日韩精品| 亚洲国产岛国毛片在线| 激情综合自拍| 久久久久国产免费免费| 久久精品国产一区二区三区| 国产精品入口夜色视频大尺度| 亚洲毛片播放| 一区二区三区回区在观看免费视频| 久久免费视频一区| 免费av成人在线| 国自产拍偷拍福利精品免费一| 亚洲一区二区三区乱码aⅴ蜜桃女 亚洲一区二区三区乱码aⅴ | 午夜精品短视频| 国产精品porn| 亚洲私人影院在线观看| 欧美性生交xxxxx久久久| 欧美一区二区三区在线观看视频| 欧美日韩一区三区| 亚洲国产女人aaa毛片在线| 91久久久一线二线三线品牌| 美女任你摸久久| 亚洲国产另类 国产精品国产免费| 亚洲二区在线视频| 麻豆精品视频在线观看| 亚洲电影网站| 在线亚洲+欧美+日本专区| 欧美日韩综合久久| 亚洲线精品一区二区三区八戒| 亚洲欧美日韩国产综合| 国产伦理一区| 久久国产精品久久久久久久久久| 久久久久久亚洲精品不卡4k岛国| 国产亚洲成精品久久| 久久网站免费| 亚洲精品一区中文| 亚洲一卡久久| 国产一区二区精品久久91| 久热爱精品视频线路一| 亚洲精品网站在线播放gif| 亚洲永久字幕| 一区二区三区中文在线观看| 欧美成人一区在线| 99v久久综合狠狠综合久久| 性色av一区二区三区红粉影视| 国产一区视频观看| 欧美激情片在线观看| 亚洲午夜日本在线观看| 久久一区精品| 亚洲图片自拍偷拍| 国产一区二区在线观看免费| 欧美.www| 亚洲欧美综合v| 亚洲福利一区| 午夜精品久久久久久久99黑人| 国内成人在线| 欧美婷婷久久| 久久人人爽人人爽| 亚洲香蕉成视频在线观看| 免费毛片一区二区三区久久久| 一区二区三区高清在线| 好吊日精品视频| 欧美日韩一卡| 久久久水蜜桃| 亚洲尤物视频网| 91久久久久久久久| 免费高清在线视频一区·| 亚洲综合色在线| 亚洲精品日韩在线观看| 国产日本欧美一区二区| 欧美日韩精品免费观看视一区二区 | 欧美大片免费看| 欧美亚洲一区二区三区| 亚洲美女在线观看| 欧美黄色影院| 噜噜噜91成人网| 香港久久久电影| 亚洲天堂av综合网| 亚洲人成网站精品片在线观看| 国产日韩欧美成人| 欧美午夜视频在线| 欧美精品一区视频| 欧美激情二区三区| 老鸭窝毛片一区二区三区|