前言
????今天我們要講的是,C++實(shí)用案例:楊輝三角形,這是一個(gè)簡單又典型的遞推算法的題目。
一、理清思路
????楊輝三角形是一個(gè)簡單的數(shù)學(xué)模型,其中,最左側(cè)的數(shù)和最右側(cè)的數(shù)都是1,剩余的數(shù)是上面兩數(shù)之和,每一行都比上一行多一個(gè)數(shù),一次往下,如圖:????

?????于是,在我們輸出左對(duì)齊時(shí),可以表示為:
????1
????1 1
????1 2 1
????1 3 3 1
????1 4 6 4 1
????1 5 10 10 5 1
????......
????于是,我們看上面的,每一個(gè)數(shù)N[i][j]=N[i-1][j]+N[i-1][j-1],我們?cè)诰幊讨?,?shù)組的思路詳細(xì)如下:

?????我們的楊輝三角從N[1][1]開始,設(shè)立一個(gè)緩沖帶,來儲(chǔ)存0,那樣可以避免使用N[i][j]=N[i-1][j]+N[i-1][j-1]時(shí)造成的數(shù)組越界從而導(dǎo)致數(shù)據(jù)紊亂的現(xiàn)象,因此,我們有了編程思路,就一起來試試吧!
二、代碼展示?
AC代碼1(普通)
#include//調(diào)用C語言標(biāo)準(zhǔn)輸入輸出頭文件?
using namespace std;//使用標(biāo)準(zhǔn)名字空間?
int n;//定義整數(shù)類型變量n?
unsigned long long N[1009][1009];//定義數(shù)組N,包含1009行1009列無符號(hào)長整數(shù)類型變量?
int main(){//主函數(shù)開始?
scanf("%d",&n);//格式化輸入n的值?
N[1][1]=1;//將N的1行1列元素賦值為1?
for(int i=2;i<=n;i++){//for循環(huán),計(jì)數(shù)器i從2自增到n,共循環(huán)n-1次?
for(int j=1;j<=i;j++){//for循環(huán),計(jì)數(shù)器j從1自增到i,共循環(huán)i次?
N[i][j]=N[i-1][j]+N[i-1][j-1];//將N的i行j列號(hào)元素賦值為N[i-1][j]+N[i-1][j-1]?
}
}
for(int i=1;i<=n;i++){//for循環(huán),計(jì)數(shù)器i從1自增到n,共循環(huán)n次?
for(int j=1;j<=i;j++){//for循環(huán),計(jì)數(shù)器j從1自增到i,共循環(huán)i次?
printf("%ld",N[i][j]);//格式化輸出N[i][j]的值
if(j!=i){//如果j不等于i?
printf(" ");//空格?
}?
}printf("\n");//換行?
}
return 0;//主函數(shù)結(jié)束,返回0?
}?
三、代碼改進(jìn)?
????但是,這里的空間復(fù)雜度(也就是內(nèi)存)完全可以簡化,而且,還可以做到三角形居中對(duì)齊,那樣更加美觀,因此,我們?cè)俳o出兩個(gè)代碼:
AC代碼2(內(nèi)存簡化)
#include//調(diào)用輸入輸出流頭文件?
#include//調(diào)用輸入輸出控制頭文件?
using namespace std;//使用標(biāo)準(zhǔn)名字空間?
int main(){//主函數(shù)開始?
int n;//定義整數(shù)類型變量n?
cin>>n;//輸入n的值?
for(int i=1;i<=n;i++){//for循環(huán),計(jì)數(shù)器i從1自增到n,共循環(huán)n次?
int p=1;//定義整數(shù)類型變量p并初始化賦值為1?
cout<//調(diào)用輸入輸出流頭文件?
#include//調(diào)用輸入輸出控制頭文件?
using namespace std;//使用標(biāo)準(zhǔn)名字空間?
int main(){//主函數(shù)開始?
int n;//定義整數(shù)類型變量n?
cin>>n;//輸入n的值?
for(int i=1;i<=n;i++){//for循環(huán),計(jì)數(shù)器i從1自增到n,共循環(huán)n次?
int p=1;//定義整數(shù)類型變量p并初始化賦值為1?
cout<標(biāo)簽: