题目不作过多解释,这里采用C++提供的queue类实现
算法思想:
由杨辉三角的规律可知,可用上一行的数来求出对应位置的下一行内容。为此需要用队列来保存上一行的内容,每当由上一行的两个数求出下一行的一个数时,其中前一个数便要删除,而新求出的数入队。
为了由存放在队列中的某行的内容求得下一行的内容,需要在两者之间建立一个对应关系,为便于求解,在每行的第一个位置添加一个0,作为辅助。
#include <queue>
#include <iostream>
using namespace std;
int main()
{
int n;
while (cin >> n)
{
int s1,s2;
queue <int> q;
cout << 1 << endl;//输出第一行的1
q.push(1);//所输出的1入队
for (int i = 2; i <= n; i++)//逐行计算2-n行的数据
{
s1 = 0;//这里用0作为辅助计算每行的第一个值
for (int j = 1; j <= i - 1; j++)//先计算并输出前n-1个数
{
s2=q.front();//取队头元素并出队
q.pop();
cout << s1 + s2 <<" ";
q.push(s1 + s2);
s1 = s2;//调整变量的值
}
cout << 1 << endl;//输出当前行最后一个元素1
q.push(1);//最后一个元素入队
}
cout<<endl;
}
return 0;
}
不使用队列,可以利用循环a[i][j]=a[i-1][j]+a[i-1][j-1];
#include <iostream>
using namespace std;
int main()
{
int n;
int a[30][30];
while(cin>>n)
{
for(int i=0;i<n;i++){
for(int j=0;j<=i;j++){
if(j==0||j==i) a[i][j]=1;
else a[i][j]=a[i-1][j]+a[i-1][j-1];
}
}
for(int i=0;i<n;i++){
for(int j=0;j<=i;j++){
cout<<a[i][j];
if(j==i) cout<<endl;
else cout<<" ";
}
}
cout<<endl;
}
return 0;
}