楊輝三角是二項式係數在三角形中的一種幾何排列
如上圖所示,每一行的第一個和最後一個都是1,每一個數等於它上方兩個數之和。
編寫代碼在屏幕上打印如圖所示楊輝三角(不包括圖中n那一列)數組
方法一:用二維數組實現
用二維數組打印楊輝三角問題與打印乘法表相似,第一個[ ]表示打印的行數,第二個[ ]表示打印的列數,再用兩層for循環遍歷,給每個元素賦相應的值。賦好值以後,再用兩層for循環遍歷進行打印出來。如下是具體步驟:ide
1)創建二維數組(此處舉例爲a[ ][ ]),並設好下標(即打印的楊輝三角層數)。此處建議使用宏定義,方便之後修改層數。 函數
#define ROW 10 #define COL 10
ps:此處舉例,打印的是10層,若想打印更多(少),直接改10就行。楊輝三角的行數與列數是相等的,若是宏定義的值不相等,打印結果是有問題的。ui
2)創建好數組後開始賦值。咱們發現楊輝三角第一層和之後每一層的第一個數及最後一個數都是1,這是固定不變的,所以這些特殊的位置須要單獨賦值。其餘的位置經過規律(該數等於它上方兩數之和)用for循環進行賦值便可。3d
a)第一層可直接賦值爲1。code
a[0][0] = 1; //第一層在數組裏下標爲0
b)第一層賦好以後,用for進行其他層的第一個和最後一個的賦值。blog
for (i = 1; i < ROW; ++i){//下標i(層數=i+1)從1開始(第二層) a[i][0] = 1; //a[i][0]:第i+1層的第一個位置。 a[i][i] = 1; //a[i][i]: 第i+1層的最後一個位置。 }
c)其他有規律的位置的賦值用一層for循環(這一層for要嵌套在上一層for循環裏)搞定it
for (j = 1; j < i; ++j) {//j(第i+1層第j+1個位置),一樣從第二個位置開始(第一個位置在上一步驟已經賦過了)j<i,同理。 a[i][j] = a[i - 1][j - 1] + a[i - 1][j];//該數的上方兩個位置分別爲正上方和左上方。 }
3)打印該二位數組。io
a)用兩層for循環遍歷便可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+1層的第一個和最後一個位置(用for循環)
for (i = 1; i < ROW; i++) { a[i] = 1;//第i+1層最後一個位置 a[0] = 1;//第i+1層第一個位置 }
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; }