藍橋杯 基礎練習 BASIC-6 楊輝三角形
阿新 • • 發佈:2021-01-21
試題 基礎練習 楊輝三角形
資源限制
時間限制: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
樣例輸出
11 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}}
因此我們只要對最後一行單獨處理:最後一行首、尾分別新增一個零然後對應位置求和就可以得到新的一行。
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;
}