• <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>
            /*
              Name: 楊輝三角算法集錦
              Copyright: 始發(fā)于goal00001111的專欄;允許自由轉(zhuǎn)載,但必須注明作者和出處
              Author: goal00001111
              Date: 27-11-08 19:04
              Description:
              分別使用了二維數(shù)組,一維數(shù)組,隊(duì)列,二項(xiàng)式公式,組合公式推論和遞歸方法等9種算法
              算法思路詳見(jiàn)代碼注釋——注釋很詳細(xì),呵呵
            */
            #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個(gè)空格
            void PrintBlank(int n)
            {
                for (int i=0; i<n; i++)
                    cout << ' ';
            }

            //使用二維數(shù)組輸出楊輝三角
            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 //規(guī)律: 左上與正上元素之和
                            a[i][j] = a[i-1][j-1] + a[i-1][j];
                       
                        cout << setw(DIS) << a[i][j];
                        if (j == i)
                            cout << endl;
                    }
                }
            }
            //使用隊(duì)列輸出楊輝三角
            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; //隊(duì)尾進(jìn)入第i+1行
                        cout << setw(DIS) << 1 << endl;            //輸出第i-1行尾部
                        front = (front+1)%max;            //對(duì)頭進(jìn)入第i行
                        PrintBlank(blank-=DIS/2);//輸出第i行空格
                    }
                    //處理中間數(shù)據(jù)
                    rear = (rear+1)%max; a[rear] = a[front] + a[(front+1)%max];
                    if (front != rear)//隊(duì)列非空時(shí)輸出
                        cout << setw(DIS) << a[front]; //輸出對(duì)頭
                    front = (front+1)%max; //刪除對(duì)頭元素
                }
                delete []a;
            }

            //使用兩個(gè)一維數(shù)組代替二維數(shù)組輸出楊輝三角
            void Fun_3(int row)
            {
                const int DIS = 6;
                int blank = 33;
                int *a = new int[row]; //存儲(chǔ)下一行
                int *b = new int[row];//存儲(chǔ)輸出行
               
                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)//已經(jīng)到最后一行則不再?gòu)?fù)制
                        continue;
                    //生成第n+1行數(shù)據(jù)
                    a[0] = b[0];
                    for (int i=1; i<n; i++)
                        a[i] = b[i] + b[i-1];
                    a[n] = 1;
                    //復(fù)制第n+1行數(shù)據(jù)
                    for (int i=0; i<=n; i++)
                        b[i] = a[i];
                }
                delete []a;
                delete []b;
            }

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


            //使用一個(gè)一維數(shù)組和兩個(gè)臨時(shí)變量代替二維數(shù)組輸出楊輝三角:方法同F(xiàn)un_4,但更具有技巧,有點(diǎn)難懂
            void Fun_5(int row)
            {
                const int DIS = 6;
                int blank = 33;
                int *a = new int[row]; //存儲(chǔ)輸出行
                for (int i=1; i<row; i++)//賦初值0,這個(gè)很重要,因?yàn)楹竺嬗杏玫?
                   a[i] = 0;
                  
                a[0] = 1; 
                int left, right;
                for (int n=1; n<=row; n++)
                {
                    left = 0;
                    //生成第n行數(shù)據(jù)
                    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;
            }

            //使用一個(gè)一維數(shù)組輸出楊輝三角;兩側(cè)的1不變,計(jì)算中間的元素
            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;//最左側(cè)為1,永遠(yuǎn)不變
                for (int n=1; n<row; n++)
                {
                    a[n] = 1; //設(shè)置最右側(cè)的1
                    for (int i=n-1; i>0; i--)//設(shè)置中間的元素,由于a[i]的值變化,故應(yīng)從右到左計(jì)算
                    {
                        a[i] += a[i-1]; //楊輝三角的規(guī)律
                    }
                    //輸出第n+1行
                    PrintBlank(blank-=DIS/2);
                    for (int i=0; i<=n; i++)
                        cout << setw(DIS) << a[i];
                    cout << endl;
                }
                delete []a;
            }

            //使用二項(xiàng)式定理輸出楊輝三角
            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;//輸出每行最后一個(gè)1
                }
            }

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

                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; //輸出每行第一個(gè)1
                    for (int m=1; m<n; m++)//輸出中間元素
                    {
                        c = c * (n - m + 1) / m;
                        cout << setw(DIS) << c;
                    }
                    cout << setw(DIS) << 1 << endl;//輸出每行最后一個(gè)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;//輸出每行最后一個(gè)1
                }
            }

            //遞歸函數(shù),輸出楊輝三角 :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)//在左右兩側(cè)返回1
                    return 1;
                return Try(n-1,k-1) + Try(n-1,k);//遞推公式 
            }
            Posted on 2008-11-27 19:12 夢(mèng)想飛揚(yáng) 閱讀(3187) 評(píng)論(2)  編輯 收藏 引用

            Feedback

            # re: 楊輝三角算法集錦   回復(fù)  更多評(píng)論   

            2008-11-28 11:48 by zuhd
            看了你的Fun_1,F(xiàn)un_2,我就不想朝下看了

            # re: 楊輝三角算法集錦   回復(fù)  更多評(píng)論   

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

            只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問(wèn)   Chat2DB   管理


            亚洲嫩草影院久久精品| 久久Av无码精品人妻系列| 国产成年无码久久久久毛片| 亚洲中文久久精品无码ww16| 国产精品久久久久久久app| 噜噜噜色噜噜噜久久| 亚洲国产精品成人AV无码久久综合影院| 久久WWW免费人成—看片| 久久91精品综合国产首页| 人妻系列无码专区久久五月天| 亚洲精品无码久久久| 亚洲国产精品无码久久久蜜芽| 欧美黑人又粗又大久久久| 久久青草国产手机看片福利盒子| 国产激情久久久久影院老熟女免费 | 久久久久一区二区三区| 久久香蕉国产线看观看99| 久久天天躁狠狠躁夜夜2020老熟妇| 久久午夜综合久久| 浪潮AV色综合久久天堂| 麻豆精品久久久一区二区| 久久久综合香蕉尹人综合网| 一本久久a久久精品vr综合| 国产综合久久久久| 久久久久国色AV免费看图片| 伊人色综合久久天天人手人婷| 99久久精品费精品国产一区二区| 观看 国产综合久久久久鬼色 欧美 亚洲 一区二区 | 精品久久久久久无码中文字幕一区| 精品国产一区二区三区久久| 久久夜色撩人精品国产| 久久国产精品无码一区二区三区| 久久精品亚洲福利| 99国产欧美久久久精品蜜芽| 亚洲午夜久久久| 91性高湖久久久久| 久久一日本道色综合久久| 亚洲国产成人久久综合一区77| 久久91综合国产91久久精品| 伊人久久综合无码成人网| 日韩久久无码免费毛片软件|