C++打印杨辉三角
杨辉三角,是二项式系数在三角形中的一种几何排列。
杨辉三角是中国古代数学的杰出研究成果之一,它把二项式系数图形化,把组合数内在的一些代数性质直观地从图形中体现出来,是一种离散型的数与形的结合。
如图所示,杨辉三角中的每个数等于它上方两数之和。每行数字左右对称,由1开始逐渐变大。
tips:
在欧洲,这个表叫做帕斯卡三角形。是欧洲人帕斯卡发现的,很多题目会有多种问法,你得记住,会考的!知道杨辉发现的最早就行。(帕斯卡比杨辉发现这一图表晚了300年)
以上内容取自百度百科,是我自己总结的。 →→ 百度知道杨辉三角
关于打印杨辉三角的问题,我个人感觉用数组更容易解决,假定求c(n,r),那么c(n,r) = c(n-1,r-1) + c(n-1,r)。本次程序并没有使用数组,用的是新手入门c++更先接触的for循环的嵌套以及简单int函数。
难点是给出当前行数n和当前行数的第r个数,利用函数求出c(n,r)。
下面给出解析:
采用递推法,
第n行的第1个数为1,
第二个数就是1×(n-1),
第三个数为1×(n-1)×(n-2)/2,
第四个数为1×(n-1)×(n-2)/2×(n-3)/3
…依此类推。
借鉴思想。 →→算法之帕斯卡算法CSDN
那么,求c(n,r) 的归纳出来的结果为for循环结果:
int getResult(int n,int r){
int p=1;
for(int i=1;i<=r;i++){
p=p*(n-i+1)/i;
}
return p;
}
很难理解是吧?我也觉得很难理解,一般都是当成公式做。
下面给出源代码:
#include<iostream>
#include<iomanip>
using namespace std;
int getResult(int n,int r){
int p=1;
for(int i=1;i<=r;i++){
p=p*(n-i+1)/i;
}
return p;
}
int main(){
int i;
int n,r,max;
/*
n当前行数,r当前行数的第r个数字,max最大行数
*/
cout<<"输入行数:";
cin>>max;
for(n=1;n<=max;n++){
for(r=1;r<=n;r++){
i=1;
if(r==1){
for(i=1;i<=max-n;i++)
cout<<" "; //每行数字前的空格
}
else
cout<<" "; //每个数字前的空格
cout<<setw(3)<<getResult(n-1,r-1);
}
cout<<endl;
}
}
tips:
你可能会疑惑,程序里为什么是求结果为什么是函数getResult(n-1,r-1)而不是getResult(n,r)?因为我的n、r都是从1开始记数的,不是0,个人习惯吧算是,感觉更多人更喜欢从0开始计数。
结果图: