下面是楊輝三角的一部分,我們觀察觀察它有什么規律:
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 7 21 35 35 21 7 1
................
通過觀察不難發現,三角的兩邊都是1,而且除邊界外的每個數的值都是其兩肩數的和,楊輝三角與二項式定理有密切關系,當(a+b)n
中n的取值分別為0,1,2,3,4.....時,其各項系數分別對應楊輝三角的第1,2,3,4,5.....行,二項式公式為:
由此得出一個非常重要的規律:在楊輝三角中,令上面公式中的n為n-1,令r為k-1,得出的值為楊輝三角中第n行第k個數的值,也就是
Ck-1n-1 = (n-1)!/((k-1)!*(n-k)!)。為了輸出美觀,我們要在每行的左邊打印空格,假設我們要打印楊輝三角的前num行,如果最后一行,
也就是最長的一行前不打印空格,則第n行前的空格個數為num-n個。
有了這些知識后就可以寫代碼了,完整的代碼如下:
1 #include<iostream> 2 3 //求階乘的函數 4 int factorial(int num) 5 { 6 if (num == 0) 7 return 1; 8 else 9 { 10 int result = 1; 11 for (int i = 1; i <= num; ++i) 12 result *= i; 13 return result; 14 } 15 } 16 17 //打印楊輝三角的函數 18 void function(int rowNum) 19 { 20 int value; 21 for (int n = 1; n <= rowNum; ++n) //對於每一行 22 { 23 for (int i = 0; i <= rowNum - n; ++i) //打印每行前的空格 24 std::cout << " "; 25 for (int k = 1; k <= n; ++k) //打印每行的每個數 26 { 27 value = factorial(n - 1) / (factorial(k - 1)*factorial(n - k)); 28 std::cout << value << " "; 29 } 30 std::cout << std::endl; 31 } 32 } 33 34 int main() 35 { 36 int lineNum; 37 std::cout << "請輸入要打印的行數:" << std::endl; 38 std::cin >> lineNum; 39 function(lineNum); 40 system("pause"); 41 return 0; 42 }
注意:以上代碼只能打印前13行的楊輝三角,原因在於求階乘的函數,我們在求階乘的函數中聲明和返回的變量類型為int型,
在32位機器中int型變量表示數的有效范圍是-2^32~2^32-1,而13的階乘超出了int的表示范圍。所以如果你需要打印出更多行
楊輝三角,可以聲明變量類型為long或者long long。