-
大意
楊輝三角是二項式係數在三角形中的一種幾何排列
如上圖所示,每一行的第一個和最後一個都是1,每個數等於它上方兩個數之和。
編寫代碼在屏幕上打印如圖所示楊輝三角(不包括圖中n那一列) - 思路
方法一:用二維數組實現
用二維數組打印楊輝三角問題與打印乘法表類似,第一個[ ]表示打印的行數,第二個[ ]表示打印的列數,再用兩層for循環遍歷,給每一個元素賦相應的值。賦好值之後,再用兩層for循環遍歷進行打印出來。以下是具體步驟:
1)建立二維數組(此處舉例爲a[ ][ ]),並設好下標(即打印的楊輝三角層數)。此處建議使用宏定義,方便以後修改層數。
#define ROW 10
#define COL 10
ps:此處舉例,打印的是10層,若想打印更多(少),直接改10就行。楊輝三角的行數與列數是相等的,如果宏定義的值不相等,打印結果是有問題的。
2)建立好數組後開始賦值。我們發現楊輝三角第一層和以後每一層的第一個數及最後一個數都是1,這是固定不變的,因此這些特殊的位置需要單獨賦值。其他的位置通過規律(該數等於它上方兩數之和)用for循環進行賦值即可。
a)第一層可直接賦值爲1。
a[0][0] = 1;//第一層在數組裏下標爲0
b)第一層賦好之後,用for進行其餘層的第一個和最後一個的賦值。
for (i = 1; i < ROW; ++i){//下標i(層數)從1開始(第二層)
a[i][0] = 1;//i表示層數,a[i][0]:第i層的第一個位置。
a[i][i] = 1;//a[i][0]:第i層的最後一個位置。
}
c)其餘有規律的位置的賦值用一層for循環(這一層for要嵌套在上一層for循環裏)搞定
for (j = 1; j < i; ++j) {//j(第i層第j個位置),同樣從第二個位置開始(第一個位置在b)已經賦過了)j<i,同理。
a[i][j] = a[i - 1][j - 1] + a[i - 1][j];//該數的上方兩個位置分別爲正上方和左上方。
}
3)打印該二位數組。
a)用兩層for循環遍歷即可
for (i = 0; i < ROW; ++i) {
for (j = 0; j <=i; ++j) {
printf("%d ", a[i][j]);
}
printf("\n");
}
結果如上圖所示,但發現結果並不是很好看。
b)通過填加空格和設置打印格式來調整即可。
for (i = 0; i < ROW; ++i) {
for (k = ROW; k >= i; k--) {//添加空格的循環,空格數與行數剛好相反,第i行有ROW-i個空格。
printf(" ");
}
for (j = 0; j <=i; ++j)
printf("%6d", a[i][j]);//設置打印格式,此處設置的是一個位置爲6個字符顯示的寬度
}
printf("\n");
}
調整後的結果爲:
方法二:用一維數組實現(此功能寫成了一個函數)
用一維數組實現更加簡潔方便,即賦好一層的值之後就打印該層,在賦值下一層的時候,前一層的數會被覆蓋掉,但不影響結果,因爲前一層 已經打印好了。以下爲具體步驟:
1)建立一維數組
int a[ROW] = { 0 };//ROW和上面同理
2)賦值。同樣的,第一層和第i層的第一個及最後一個都是1,較爲特殊,需單獨賦值處理,其餘位置遵循規則(該數等於它上面的兩數之和)用for循環賦值。
a)賦第一層並打印
a[0] = 1;
printf(" %d \n", a[0]);
b)賦第i層的第一個和最後一個位置(用for循環)
for (i = 1; i < ROW; i++) {
a[i] = 1;//第i層最後一個位置
a[0] = 1;第i層第一個位置
}
c)賦其餘位置(同樣用for循環且嵌套在上一個循環內)
for (j = i-1; j > 0; --j) {//此處採用逆序賦值,從第i行倒數第二個開始
a[j] = a[j] + a[j - 1];
}
3)一行賦值完成後立即打印,這就要求打印放在第一個for循環裏。
a)利用一個for循環便利即可(此處將該功能寫成了一個函數)
void print_arr1(int a[], int n) {
int i = 0;
for (i = 0; i < n; ++i) {
printf(" %d ", a[i]);
}
}
ps:記住每調用一次該函數,要加一句printf("\n");進行換行。
打印結果如下圖,同樣不太美觀
b)同樣通過填加空格和設置打印格式來調整即可
for (k = ROW; k >= 0; k--) {//用於打印第一行空格,加在第一行賦值後面。
printf(" ");
}
for (k = ROW; k >= i; k--) {
printf(" ");//用於打印第i層的空格,加在第一層循環的賦值循環後。
}
printf(" %3d", a[i]);//調整打印格式
調整後結果爲:
-
參考代碼
#include<stdio.h> #include<stdlib.h> #define ROW 10 #define COL 10 void print_arr1(int a[], int n) { int i = 0; for (i = 0; i < n; ++i) { printf(" %3d", a[i]); } } //用一維數組實現 void print_yanghui() { int a[ROW] = { 0 }; int i,j,k; a[0] = 1; for (k = ROW; k >= 0; k--) { printf(" "); } printf(" %3d\n", a[0]); for (i = 1; i < ROW; i++) { a[i] = 1; for (j = i-1; j > 0; --j) { a[j] = a[j] + a[j - 1]; } a[0] = 1; for (k = ROW; k >= i; k--) { printf(" "); } print_arr1(a, i+1); printf("\n"); } } int main() { //二維數組實現 int a[ROW][COL] = { 0 }; int i,j,k; a[0][0] = 1; for (i = 1; i < ROW; ++i){ a[i][0] = 1; for (j = 1; j < i; ++j) { a[i][j] = a[i - 1][j - 1] + a[i - 1][j]; } a[i][i] = 1; } for (i = 0; i < ROW; ++i) { for (k = ROW; k >= i; k--) { printf(" "); } for (j = 0; j <=i; ++j) { printf("%6d", a[i][j]); } printf("\n"); } printf("\n\n\n\n\n"); //一維數組實現 print_yanghui(); system("pause"); return 0; }
- 運行結果