網站首頁 編程語言 正文
1. 題目描述
楊輝三角形
解題之前,我們先來了解一下楊輝三角形到底是什么?
楊輝三角形,又稱帕斯卡三角形、賈憲三角形、海亞姆三角形,它的排列形如三角形。
因為首現于南宋楊輝的《詳解九章算法》得名,而書中楊輝說明是引自賈憲的《釋鎖算書》,故又名賈憲三角形。
古代波斯數學家歐瑪爾·海亞姆也描述過這個三角形。在歐洲,因為法國數學家布萊茲?帕斯卡在1653年的《論算術三角》中首次完整論述了這個三角形,故也被稱作帕斯卡三角(Pascal’s triangle)。
楊輝三角的前10行寫出來如下
2. 解題思路
其實規律很簡單,我們來看一看
在最上面一行的中央寫下數字 1;
第二行,寫下兩個1,和上一行形成三角形;
隨后的每一行,開頭和最后的數字都是1,其他的每個數都是它左上方和右上方的數之和,就是說除每行最左側與最右側的數字以外,每個數字等于它的左上方與右上方兩個數字之和。
3. 動圖演示
4. 代碼實現
我們通過動圖可以得出以下結論
1、兩邊都是數字1;
2、從第三行開始,除了兩邊的數字1之外的數字都是由 “肩膀上” 的數字相加得到的。
對于算法不太熟悉的朋友,如果直接去打印,可能就比較困難,所以我們不妨拆開幾步來做。
Step1
1、定義一個9行9列的二維整型數組;
2、數組所有元素都賦值為1;
3、輸出數組所有元素
#include <stdio.h> int main() { //定義一個9行9列的二維整型數組 int data[9][9]; int i = 0; int j = 0; for (i = 0; i < 9; i++) { for (j = 0; j < 9; j++) { //數組所有元素都賦值為1 data[i][j] = 1; } } //輸出數組所有元素 for (i = 0; i < 9; i++) { for (j = 0; j < 9; j++) { printf("%6d", data[i][j]); } printf("\n"); } return 0; }
我們輸出看一下
但是我們只需要左下角的數字
所以對第二個for循環進行修改,讓j <= i;
#include <stdio.h> int main() { //定義一個9行9列的二維整型數組 int data[9][9]; int i = 0; int j = 0; for (i = 0; i < 9; i++) { for (j = 0; j < 9; j++) { //數組所有元素都賦值為1 data[i][j] = 1; } } //輸出數組所有元素 for (i = 0; i < 9; i++) { //修改j <= i for (j = 0; j <= i; j++) { printf("%6d", data[i][j]); } printf("\n"); } return 0; }
運行看一看
Step2
中間位置的數字是由它上一行對應位置的數字以及上一行對應位置左側的數字相加得到;
因為下一行的情況總需要由上一行的情況推出,即我們需要記錄每一行的結果。
所以構建楊輝三角本質上是一個動態規劃問題,我們可以總結出如下推導式:
其中,dp[i][j]表示第i行的第j個數。
#include <stdio.h> int main() { //定義一個9行9列的二維整型數組 int data[9][9]; int i = 0; int j = 0; for (i = 0; i < 9; i++) { for (j = 0; j < 9; j++) { //數組所有元素都賦值為1 data[i][j] = 1; } } //dp for (i = 1; i < 9; i++) { for (j = 1; j < i; j++) { data[i][j] = data[i-1][j] + data[i-1][j-1]; } } //輸出數組所有元素 for (i = 0; i < 9; i++) { for (j = 0; j <= i; j++) { printf("%6d", data[i][j]); } printf("\n"); } return 0; }
運行結果
居中顯示
我們如何讓楊輝三角形居中顯示呢?
就像這樣
很簡單,代碼如下
for (int k = 0; k < 26 - (6 * i / 2); k++) { printf(" "); }
這是什么意思呢?
1、每行前輸出不等的空格;
2、為何i / 2?因為:居中只需左邊加空格;
3、為何要乘6?因為:輸出時用%6d;
4、為何要用26減?因為:不大不小剛剛好?
5. 完整代碼
代碼示例
#include <stdio.h> int main() { //定義一個9行9列的二維整型數組 int data[9][9]; int i = 0; int j = 0; for (i = 0; i < 9; i++) { for (j = 0; j < 9; j++) { //數組所有元素都賦值為1 data[i][j] = 1; } } //dp for (i = 1; i < 9; i++) { for (j = 1; j < i; j++) { data[i][j] = data[i - 1][j] + data[i - 1][j - 1]; } } //輸出數組所有元素 for (i = 0; i < 9; i++) { //用三角形的方式打印 for (int k = 0; k < 26 - (6 * i / 2); k++) { printf(" "); } for (j = 0; j <= i; j++) { printf("%6d", data[i][j]); } printf("\n"); } return 0; }
6. 特性總結
楊輝三角的美妙之處在于:它是如此足夠簡單,但本身在數學上卻擁有豐富的魅力。
這是數學中的最令人稱奇的事物之一,隨便取諸多數學性質中的某個,就能表明它是多么的精彩絕倫。
比如:隱藏數列、完全平方數、斐波那契數列、謝爾賓斯基三角、組合數學、二項式定理等等,這些都都可以在楊輝三角形中找到,你發現了嗎?
原文鏈接:https://blog.csdn.net/m0_63325890/article/details/122781323
相關推薦
- 2022-11-04 Android自定義View實現時鐘功能_Android
- 2022-12-25 Flutter桌面開發windows插件開發_Android
- 2024-01-08 AOP獲取方法返回值
- 2022-12-06 靜態pod?創建使用示例詳解_docker
- 2022-09-25 C#基礎--特殊的集合
- 2022-04-17 create-react-app新版本快速搭建一個簡易的路由頁面
- 2022-09-30 Python3中map()、reduce()、filter()的用法詳解_python
- 2022-04-07 Qt實現邊加載數據邊顯示頁面的示例代碼_C 語言
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支