1. 程式人生 > 其它 >藍橋杯 基礎練習 BASIC-6 楊輝三角形

藍橋杯 基礎練習 BASIC-6 楊輝三角形

技術標籤:藍橋杯練習演算法pythonc語言c++資料結構

試題 基礎練習 楊輝三角形

資源限制
時間限制:1.0s 記憶體限制:256.0MB

問題描述
楊輝三角形又稱Pascal三角形,它的第i+1行是(a+b)i的展開式的係數。
它的一個重要性質是:三角形中的每個數字等於它兩肩上的數字相加。 下面給出了楊輝三角形的前4行:
1
1 1
1 2 1
1 3 3 1
給出n,輸出它的前n行。

輸入格式
輸入包含一個數n。

輸出格式
輸出楊輝三角形的前n行。每一行從這一行的第一個數開始依次輸出,中間使用一個空格分隔。請不要在前面輸出多餘的空格。

樣例輸入
4
樣例輸出
1

1 1
1 2 1
1 3 3 1

資料規模與約定
1 <= n <= 10000。

通過觀察,可以發現以下幾點:

  • 當前行只比上一行多了一個元素
  • 本行元素等於上一行元素往後錯一位再逐個相加,如第五行如下所得:
    1 3 3 1 0 0 1 3 3 1 1 4 6 4 1 \frac{\begin{matrix} 1 & 3 & 3 & 1 & 0\\ 0 & 1 & 3 & 3 & 1 \end{matrix}}{\begin{matrix} 1 & 4 & 6 & 4 & 1 \end{matrix}}
    146411031331301

因此我們只要對最後一行單獨處理:最後一行首、尾分別新增一個零然後對應位置求和就可以得到新的一行。

Python 程式碼

n = int(input())

res = [[1]]
while len(res) < n:
    newRow = [a+b for a, b in zip([0]+res[-1], res[-1]+[0])]
    res.append(newRow)

for row in res:
    for i in row:
        print(i, end=' ')
    print()

C/C++ 程式碼

很顯然,C語言不適合上文解法,所以使用常規做法

非陣列版

#include <cstdio>

int main() {
    long long s = 1;
    int n;
    scanf("%d", &n);
    
    printf("1\n");
    for (int i = 2; i <= n; s = 1, i++) {
        printf("1 ");
        for (int j = 1; j <= i - 2; j++)
            printf("%d ", (s = (i - j) * s / j));
        printf("1\n");
    }
    return 0;
}

陣列版

#include <cstdio>

int main() {
    long long num[35][35] = {{1},{1,1}};
    int n;
    scanf("%d", &n);
    for (int i = 2; i < n; ++i) {
        num[i][0] = 1;
        for (int j = 1; j <= i; ++j) {
            num[i][j] = num[i-1][j] + num[i-1][j-1];
        }
    }
    for (int i = 0; i < n; ++i) {
        for (int j = 0; j <= i; ++j) {
            printf("%d ", num[i][j]);
        }
        printf("\n");
    }
    return 0;
}