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

/*
  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 夢想飛揚 閱讀(3201) 評論(2)  編輯 收藏 引用

Feedback

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

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

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

2009-04-10 14:27 by zouzhi
很好啊,可以引發多種思路。我那個隊列還是不大懂啊

只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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国内精品久久| 亚洲最新在线| 亚洲伊人一本大道中文字幕| 亚洲娇小video精品| 亚洲欧洲日韩在线| 99热精品在线| 亚洲欧美日韩国产综合精品二区| 91久久综合亚洲鲁鲁五月天| 亚洲人成绝费网站色www| 在线观看视频一区| 亚洲国产天堂久久综合| 亚洲精品中文字幕有码专区| 一区二区三区精品视频在线观看| 中文av一区特黄| aa级大片欧美三级| 午夜综合激情| 欧美成人精品1314www| 亚洲日本一区二区三区| 亚洲国产精品久久久久秋霞不卡 | 欧美成人在线网站| 亚洲人成在线播放| 亚洲女爱视频在线| 久久人人超碰| 国产精品v欧美精品v日本精品动漫| 国产精品久久久久av免费| 国产日韩专区| av不卡免费看| 女女同性精品视频| 亚洲香蕉成视频在线观看| 久久久久久尹人网香蕉| 欧美三级欧美一级| 久久国产精品久久国产精品| 樱桃成人精品视频在线播放| 亚洲欧洲免费视频| 午夜天堂精品久久久久| 麻豆精品传媒视频| 亚洲美女中出| 久久精品中文字幕免费mv| 欧美日韩国产精品自在自线| 国产日韩专区在线| 99国产精品久久久久久久久久 | 一本久久知道综合久久| 欧美一区二区视频97| 欧美国产日韩在线观看| 亚洲专区国产精品| 欧美精品亚洲精品| 1769国产精品| 午夜欧美不卡精品aaaaa| 亚洲福利视频免费观看| 亚洲专区欧美专区| 国产精品国产一区二区| 99视频在线观看一区三区| 欧美成人在线网站| 欧美自拍丝袜亚洲| 国产精品毛片大码女人| 日韩午夜精品| 欧美国产日韩精品| 久久夜色精品| 伊人春色精品| 久久女同精品一区二区| 亚洲专区一区二区三区| 欧美调教视频| 亚洲一区免费视频| 亚洲天堂男人| 国产精品超碰97尤物18| 亚洲免费观看高清完整版在线观看熊| 卡通动漫国产精品| 久久福利资源站| 国产一区视频观看| 久久久综合香蕉尹人综合网| 香蕉久久夜色精品国产| 国产日韩在线播放| 久久午夜国产精品| 久久久不卡网国产精品一区| 伊人久久成人| 最新国产成人在线观看| 欧美视频精品在线| 欧美一区二区视频在线| 久久av老司机精品网站导航| 国产丝袜一区二区| 久久久之久亚州精品露出| 久久福利毛片| 亚洲精品日本| 日韩视频专区| 国产精品网站一区| 久久亚洲私人国产精品va媚药 | 欧美日韩国产不卡在线看| 日韩午夜电影av| 午夜久久黄色| 久久黄色级2电影| 久久免费的精品国产v∧| 在线观看国产日韩| 亚洲国产视频a| 国产精品毛片在线看| 久久亚洲影音av资源网| 欧美国产综合一区二区| 先锋亚洲精品| 美女脱光内衣内裤视频久久网站| 亚洲人成亚洲人成在线观看图片| 亚洲人www| 黄色国产精品| 9i看片成人免费高清| 国模一区二区三区| 亚洲精选一区二区| 一区二区三区在线观看欧美| 亚洲精品五月天| 国内成+人亚洲+欧美+综合在线| 亚洲第一级黄色片| 国产伦精品一区二区三区高清 | 亚洲精选在线观看| 午夜精品福利电影| 日韩一级黄色av| 香蕉成人久久| 亚洲欧美综合| 欧美精品免费播放| 久久精品国产999大香线蕉| 欧美劲爆第一页| 欧美成人资源网| 国产亚洲va综合人人澡精品| 91久久夜色精品国产九色| 国产主播一区二区| 亚洲香蕉视频| 亚洲一区二区三区高清| 欧美黄色一区| 亚洲第一主播视频| 在线不卡a资源高清| 香蕉乱码成人久久天堂爱免费| 亚洲一级特黄| 国产精品成人在线观看| 亚洲第一福利视频| 亚洲福利国产精品| 欧美在线一级va免费观看| 欧美亚洲免费电影| 欧美日韩国产高清| 亚洲精品日韩在线观看| 亚洲国产精品成人| 麻豆91精品| 欧美激情精品久久久久久久变态 | 国产精品草草| 中文一区在线| 亚洲一区二区三区涩| 欧美日韩国内自拍| 中文欧美在线视频| 亚洲在线成人精品| 国产精品国产精品| 午夜视频久久久| 免费在线欧美视频| 亚洲精品视频一区二区三区| 亚洲欧美综合精品久久成人| 欧美精品日韩一本| 久久综合网hezyo| 亚洲高清av在线| 欧美成人在线免费观看| 亚洲人成人一区二区在线观看| 亚洲黄色三级| 欧美日韩免费观看一区| 夜夜嗨av一区二区三区中文字幕 | 亚洲区在线播放| 一区二区三区.www| 国产精品一区二区三区观看| 久久久久国产成人精品亚洲午夜| 久久久噜噜噜久久中文字幕色伊伊| 国内精品视频一区| 欧美激情精品久久久久久大尺度| 一区二区三区**美女毛片| 久久精品国产一区二区三| 亚洲欧洲精品一区二区三区 | 亚洲人在线视频| 久久gogo国模啪啪人体图| 激情国产一区| 欧美日韩国产高清| 久久av一区二区三区漫画| 欧美成人综合网站| 亚洲影视在线| 亚洲电影观看| 国产亚洲成av人在线观看导航 | 欧美jizz19性欧美| 亚洲一区影院| 亚洲国产精品久久久久婷婷884| 亚洲欧美日韩精品久久久久| 激情欧美一区二区三区在线观看| 欧美日韩视频在线| 老司机一区二区三区| 午夜精品久久久久久久久久久| 亚洲国产日韩一区| 久久中文久久字幕| 亚洲字幕在线观看| 99视频日韩| 亚洲伦理在线观看| 韩日欧美一区二区| 欧美午夜欧美| 欧美久久电影| 美女视频一区免费观看| 久久精品最新地址| 午夜老司机精品| 亚洲已满18点击进入久久| 在线视频欧美日韩|