输出打印杨辉三角属于队列实现的例子。
杨辉三角的特点我们都知道,每行的数字等于其上层左右两个数字之和。
通过队列,将输出的数字保存入队,因为后面的数字需要用到前面的数字和的运算。第一行的1是默认直接入队输出的,每行的最后一个1也是默认输出的,它与前面的数字没有关系。其他的数字可以通过队头元素和下一个元素之和求得。注意第一个元素是通过上面的1和在其左边添一个0得到的。
#include <iostream>
#include <queue>
using namespace std;
void print_Triangle(int n){
queue<int>q;
for(int i=0;i<2*n-1;i++) //控制输出,美观
cout<<" ";
cout<<1<<" "<<endl; //输出第一行的1
q.push(1);
int s1,s2;
for(int i=2;i<=n;i++){
for(int k=0;k<2*n-i;k++) //控制输出,美观
cout<<" ";
s1 = 0;
for(int j=1;j<=i-1;j++){
s2 = q.front();
q.pop(); //出队
cout<<s1+s2<<" ";
q.push(s1+s2);
s1 = s2; //s1保留的是前一个数
}
cout<<1<<endl; //输出每行最后一个1
q.push(1);
}
}
int main(){
int n;
cin>>n; //输入要得到的杨辉三角的行数
print_Triangle(n);
return 0;
}
当时她问我,能不能不看书上的代码,我自己写出来。我想,不看书上的代码,我完全可以另一种简单的做法解决。。
记数组a[i][j]表示第i行第j列的数字,除了一些个别位置的数字默认赋值为1外,其他的数字可以用以下公式:
a[i][j] = a[i-1][j-1] + a[i-1][j]
也就是各行的数字等于上一行肩上的两数字之和,之后输出便是。
#include <iostream>
using namespace std;
int main(){
int a[10][10]; //保存杨辉三角的元素
for(int i=1;i<10;i++){
for(int j=1;j<=i;j++){
if(i==1&&j==1)
a[i][j] = 1;
else{
if(j==1 || j==i)
a[i][j] = 1;
else
a[i][j] = a[i-1][j-1] + a[i-1][j];
}
}
}
int n;
cin>>n;
for(int i=1;i<=n;i++){
for(int k=0;k<2*n-i;k++) //控制输出,美观
cout<<" ";
for(int j=1;j<=i;j++){
cout<<a[i][j]<<" ";
}
cout<<endl;
}
return 0;
}