1. 程式人生 > >ACM中楊輝三角的多種解法

ACM中楊輝三角的多種解法

楊輝三角的多種解法

楊輝三角的相信大家很熟悉吧,但是大家能用多少中方法寫出來呀,一般人都只會想到兩種,遞迴和二項式。當用遞推時,有時在解題是根本沒必要需要那麼多呀,而只要楊輝三角的某一行,資料小時,我們可以用二項式來計算,但是資料比較大時,二項式算也是很麻煩的,那麼還有其它的方法嗎?所以下面我就介紹幾種計算楊輝三角的方法吧。

主要要記住第四種。。。。

一:二維陣列

遞推公式:f[1][1]=1 ,  f[i][j]=f[i-1][j-1]+f[i-1][j]

核心程式碼:

f[1][1]=0;
for(int i=1;i<10;i++)
{
    for(int j=1;j<=i;j++)
    {
        f[i][j]=f[i-1][j-1]+f[i-1][j];
    }
}


二:一維陣列

思想:用一個一維陣列把相鄰兩個數的和計算出來儲存,到下一行時就輸出。。。

程式碼:

#include <stdio.h>
void main()
{
    int N = 13;       /* 維數 */
    int a[80] = {0};
    int b[80] = {0};
    int i, j;
    b[1]=1;
    for (i = 1; i <= N; i++)
    {
        for (j = 1; j <= i; j++)
            a[j] = b[j] + b[j-1];

        for (j = 1; j <= i; j++)  /* copy當前行a[]到b[]中以備下行的所用 */
        {
            b[j] = a[j];
            printf("%-6d", b[j]);
        }
        printf("\n");
    } 
}

分析其思路是用一維陣列做,實際上用的是兩個一維陣列a[], b[].其中a[]是儲存當前行各元素的值b[]可以認為是一個臨時陣列它是a[]的一個備份也就是說在每行a[]元素置數完畢後,a[]中的內容拷貝到b[],因為進行下一行的運算時, a[]會被重置而且由楊輝三角的規律知下一行要用到上一行的元素這樣在計算下一行的a[]時就可以用儲存在b[]中的上一行的元素了(咋感覺這麼囉嗦呢^_^)。也正因為如此在每一行運算完之後,就要將其輸出顯示下一行時a[]就是新值了。所以用這種方法最後程式結束時並沒有將三角中所有元素儲存下來,只是在程式執行過程中將其輸出。

    再看其程式的核心部分: a[j] = b[j] + b[j-1]; 

其開始定義了陣列a[80],b[80]0號元素並未使用,即每一行的元素都是從a[1]開始的。但這個0號元素是不是真的沒用呢?稍加分析可知當然否,而且感覺這個0號元素用的挺巧妙,比如說到第5行時(其實與第幾行沒關係),輸出第一個元素的語句是 a[1]=b[1]+b[0], 由於b[1]1, 這時0號元素就派上用場了,b[0]0, 可以將每一行的第一個元素置為1, 往下走有第二個元素 a[2]=b[2]+b[1]; ...開始按楊輝三角的規律走。同理,到最後一個元素時,a[5]=b[5]+b[4],在上一行中只有4個元素,即此時b[]中只有4個有效元素,那這個b[5]算什麼呢?其實它跟那個0號元素有相同的作用,因為初始化時陣列中的所有元素都置為0,所以這時的b[5]0,由b[4]1可得a[5]1。這樣可以將每一行的最後一個元素置為1。對於各行,此法均適用,實際上就是在滿足楊輝三角兩側值均為1的規律。

三:二項式定理:

公式:第n行第i個數表示為C(n-1,r)    注:C(n,m)=n!/[m!(n-m)!]

程式碼:
#include<cstdio>
#include<iostream>

using namespace std;

int C(int n,int m)
{
    int k=1,j=1,i;
    for(i=n;i>n-m;i--)
    {
        k=k*(i)/j;   //注意組合數的演算法,分子從大到小計算,分母從小到大計算
        j++;
    }
    return k;
}

int main()
{
    int i,j;
    for(i=1;i<=10;i++)
    {
        for(j=0;j<i;j++)
        {
            printf("%d ",C(i-1,j));
        }
        printf("\n");
    }
    return 0;
}

四:遞推公式法:

這個方法接觸還是在今年的多校聯合的題目中hdu4927,不然我也不會知道這個方法,這個方法感覺跟二項式有點關係。。。。

這個方法就直接貼程式碼啦。

#include<cstdio>
#include<iostream>

using namespace std;

int main()
{
    int b=1,i,j;
 
    for(i=1;i<10;i++)
    {
        b=1;
        for(j=1;j<=i;j++)
        {
            printf("%d\t",b);
            b=b*(i-j)/j;         //核心部分
        }
        printf("\n");
    }
    return 0;
}


相關推薦

ACM三角多種解法

楊輝三角的多種解法 楊輝三角的相信大家很熟悉吧,但是大家能用多少中方法寫出來呀,一般人都只會想到兩種,遞迴和二項式。當用遞推時,有時在解題是根本沒必要需要那麼多呀,而只要楊輝三角的某一行,資料小時,

Python三角的理解(廖雪峰教程例)

在看到廖雪峰教程生成器一節習題楊輝三角時,一開始感覺很苦惱,沒有思路,網上的各種解答也只是梳理程式執行過程,而沒有抽象化解決問題的思路 注意:看此教程前請先學習生成器的原理,yield返回的用法規律,不然可能會懵逼。 下面我按照自己的理解寫下思路: 首先附上我們需要求得

Java小題,通過JNI調用本地C++共享庫的對應方法實現三角的繪制

question 文件夾 path ron variable iostream ring printf spl 1.在Eclipse中配置Javah,配置如下 位置是你javah.exe在你電腦磁盤上的路徑 位置:C:\Program Files\Java\jdk1.

三角的幾種解法(python)

1. 計算楊輝三角,普通法 #計算楊輝三角 普通法 triangle = [[1],[1,1]] for i in range(2,6): swap = triangle[i-1] cul = [1] for j in range(i-1):

js實現三角

實現效果:楊輝三角 即: 提示使用者輸入要實現的楊輝三角行數: 請輸入楊輝三角的行數: 8 程式碼實現後的效果如下: 1 1.1 1.2.1 1.3.3.1 1.4.6.4.1 1.5.10.10.5.1 1.6.15.20.15.6.1 1

用java的二維陣列列印輸出《三角

package oop; /**  *   * @author CZL  * 使用二維陣列列印一個 10 行楊輝三角. 1 1 1 1 2 1 1 3 3  1 1 4 6  4  1 1 5 10 10 5 1  ....    【提示】  1. 第一行有 1 個元素, 第

javaleetcode之用Arraylist List實現三角

要用java  ArrayLIsts實現下面的形式,題目是在leetcode上看到的,        1     1    1  1   2   1 1   3   3  1 具體看看用程式碼怎麼

C語言列印三角多種方法

3.在螢幕上列印楊輝三角。 1 1 1 1 2 1 1 3 3 1 解法一: #define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> int main() {     int i,j,n = 0;     //首

ACM程式設計選修課——1031: Hungar的得分問題(二)(三角+二進位制轉換)

1031: Hungar的得分問題(二) 時間限制: 1 Sec  記憶體限制: 64 MB 提交: 15  解決: 10 [提交][狀態][討論版] 題目描述 距離正式選秀時間越來越近了,今天H

C++編寫利用資料結構佇列(Queue)打印出使用者所指定長度的三角

#include <iostream> #include <assert.h> using namespace std; class Yanghui{ public:  class Node{  public:   Node():data(0){  

三角的鏈佇列解法(鏈佇列操作標頭檔案)

//LinkQueue.h #include<stdlib.h> #define TRUE 1 #define FALSE 0 #define datatype int struct n

Pascal's Triangle II 生成三角的某行

題目: 連結 解答: 在上一題基礎上修改,注意行號。 程式碼: class Solution { public: vector<int> getRow(int rowIndex) { vector<vector<int> > res

求第n行三角(n很大,取模

int 為什麽不能 style code 為我 max sin clas pan 1 #include <iostream> 2 #include <cstdio> 3 4 using namespace std; 5 typedef

簡易的三角

而已 分享 scan can png std 維數 void src 利用二維數組,可以更加清晰的理解楊輝三角的規律: 將二維數組看成表格形式,總結楊輝三角規律如上。 代碼: #include <stdio.h> void main(){   int

python3 實現 三角

src 組合 楊輝三角 不同 tex 合數 三角形 itl enter 楊輝三角,是二項式系數在三角形中的一種幾何排列。在歐洲,這個表叫做帕斯卡三角形。帕斯卡(1623----1662)是在1654年發現這一規律的,比楊輝要遲393年,比賈憲遲600年 概述 前提:每行

C語言打印三角(2種方法)

階乘 這就是 其它 原因 空格 自定義函數 一行 就會 列數 楊輝三角是我們從初中就知道的,現在,讓我們用C語言將它在計算機上顯示出來。在初中,我們就知道,楊輝三角的兩個腰邊的數都是1,其它位置的數都是上頂上兩個數之和。這就是我們用C語言寫楊輝三角的關鍵之一。在高中的時候我

遞歸 正則表達式 三角

排列 這也 合數 title 個數 對稱 表示 n-2 ... 遞歸 1 1 2 3 5 8 13 21 34 ?1 2 3 4 5 6 7 8 9 ? function dg (n){    if (n == 1 || n == 2) {    return 1;   

三角

sca 楊輝三角 () scan n) pri clu can tdi #include<stdio.h> main(){ int n,i,j; int s[10][10];printf("請輸入楊輝三角的行數n:");scanf("%d",&n);fo

三角js算法

fault ret 一個 藝龍網 出了 多少 職位 自己 -1 上個星期,小熙有幸去藝龍網面試web前端開發職位,技術經理在面試中,給小熙出了一道數學題。學名楊輝三角。用函數計算出第n行,第m個數值是多少。直接看效果吧 讓我用函數算出,第n行,第m個數字是什麽。作為理