• <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) 閱讀(3191) 評(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   管理


            欧美午夜精品久久久久免费视 | 久久久久久伊人高潮影院 | 久久这里有精品| 久久影视综合亚洲| 日韩欧美亚洲国产精品字幕久久久| 国产精品福利一区二区久久| 久久99精品久久久久子伦| 久久精品国产91久久综合麻豆自制 | 97精品伊人久久久大香线蕉| 久久久精品国产免大香伊| 久久国产精品77777| 国产一区二区精品久久岳| 久久天天躁狠狠躁夜夜av浪潮| 狼狼综合久久久久综合网| 日本一区精品久久久久影院| 一本久久a久久精品综合香蕉| 2020久久精品亚洲热综合一本| MM131亚洲国产美女久久| 精品久久久久中文字幕一区| 久久天天躁狠狠躁夜夜2020一| 久久国产精品一区二区| 久久亚洲国产最新网站| 久久精品国产亚洲av日韩| 亚洲日韩欧美一区久久久久我| AA级片免费看视频久久| 亚洲国产精品无码成人片久久| 久久国产精品二国产精品| 久久久久久夜精品精品免费啦| 久久久久这里只有精品 | 97精品依人久久久大香线蕉97 | av午夜福利一片免费看久久| 久久婷婷色香五月综合激情| 国产欧美一区二区久久| 91精品国产9l久久久久| 久久天天躁狠狠躁夜夜不卡| 久久中文字幕视频、最近更新 | 狠狠精品干练久久久无码中文字幕| 久久午夜伦鲁片免费无码| 波多野结衣久久精品| 亚洲а∨天堂久久精品| 一本色道久久88综合日韩精品 |