#include <stdio.h> #include <string.h> #define N 100 #define OK 1 #define ERROR 0 int f[N]={0,1,1,0}; //使用一个队列输出n行杨辉三角; /* 技巧: 为使第i行与第i+1行数据可以区分开,在两行之间放入一个数字0; */ void Print1(int n) { //自己的算法使用一个队列输出杨辉三角; int i,j,m; //n代表打印n行; printf("这是一个打印杨辉三角的函数:\n"); i=1;j=4; /*j=(j+1)%N;*/ while(n--) { do{ int t; if(i==0) t=N-1; else t=i-1; //防止当i=0时,i-1溢出; f[j]=f[i]+f[t]; if(f[j]) printf("%d ",f[j]); i=(i+1)%N;j=(j+1)%N; m=i-1; if(m==-1) m=N-1; }while(f[m]);//当f[m]为0时,计算当下并在后面补0,并退出这一重循环; f[j]=0; j=(j+1)%N; printf("\n"); } } typedef struct LinkList { int *x; int base,top; }LinkList; LinkList L; void ChuShi(LinkList &L) { //初始化队列函数; L.x = new int[N]; L.top=L.base=0; printf("队列初始化完毕!\n"); } void Jin(LinkList &L,int m) { //将数值m插入队尾; L.x[L.base]=m; L.base=(L.base+1)%N; } void Chu(LinkList &L,int &t) { //最前方的系数出队; t=L.x[L.top]; L.top=(L.top+1)%N; } void yanghui(int n) { //书上的方法,也是使用一个队列输出杨辉三角,但具体操作有所不同! /* 好处: 当你向队列中队尾加入元素的时候,只需要将值得多少传入函数中即可, 而不需要再去记录队尾的位置,这个在队列的结构体中自己有所体现! */ int i,j; Jin(L,1);Jin(L,1); int s=0,t; for(i=1;i<=n;i++) { Jin(L,0);//各行之间插入一个0表示区分; for(j=1;j<=i+2;j++) { //处理第i行的i+2个元素; Chu(L,t); Jin(L,s+t); s=t; if(j!=i+2) printf("%d ",s); } printf("\n"); } } int main() { printf("请输入需要打印的杨辉三角的行数:\n"); int x; scanf("%d",&x); /*自己的方法: printf("1 1\n"); Print1(x); */ //书上的方法: ChuShi(L); yanghui(x); return 0; }