【问题描述】杨辉三角形是由〖(a+b)〗n二项式展开的各项系数形成的,当n=0,系数为1,生成第一行的元素;当a=1,a+b的各项系数组成第二行的元素;当n=2,a2+2ab+b^2的各项系数组成第三行的元素,以此类推。杨辉三角形的特点每一行的第一个元素和最后一个元素都为1;其他位置上的数字是上一行中与之相邻的两个整数之和。请利用队列打印杨辉三角形前n行元素。
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
1 6 15 20 15 6 1
【基本要求】
输入一个整数,表示打印杨辉三角形的行数
按照图示的三角形的形式在屏幕上打印出杨辉三角形。
【测试数据】
输入打印杨辉三角形的行数3,输出
1
1 1
1 2 1
输入打印杨辉三角形的行数7,输出
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
1 6 15 20 15 6 1
【实现提示】
可以利用循环队列实现打印杨辉三角形的过程:再循环队列中依次存放第i-1行上的元素,然后逐个出队并打印,同时生成第i行元素并入队。
//函数声明
#include <stdio.h>
#define MAX 100
#define FALSE 0
#define TRUE 1
//循环队列
typedef struct {
int element[MAX];
int front; //头指针
int rear; //尾指针
} SeqQueue;
//初始化循环队列
void InitQueue(SeqQueue *q) { q->front = q->rear = 0; }
//入队
int EnterQueue(SeqQueue *q, int x) {
if ((q->rear + 1) % MAX == q->front) {
printf("---队列已满---");
return FALSE;
}
q->element[q->rear] = x;
q->rear = (q->rear + 1) % MAX;
return TRUE;
}
//出队
int DeleteQueue(SeqQueue *q, int *x) {
if (q->front == q->rear) {
printf("---队列为空---");
return FALSE;
}
*x = q->element[q->front];
q->front = (q->front + 1) % MAX;
return TRUE;
}
//取对头元素
int GetHead(SeqQueue *q, int *x) {
if (q->front == q->rear)
return FALSE;
*x = q->element[q->front];
return TRUE;
}
//判断队列是否为空
int IsEmpty(SeqQueue *q) {
if (q->front == q->rear)
return TRUE;
else
return FALSE;
}
//打印杨辉三角
void YangHuiTriangle(int N) {
SeqQueue q;
InitQueue(&q);
int n, i, x, temp;
EnterQueue(&q, 1); //第一行元素入队
for (n = 2; n <= N; n++) {
EnterQueue(&q, 1); //第n行第一个元素入队
for (i = N; i >= n; i--) //给数字间加空格,打印出金字塔形状
printf(" "); // N为打印的行数,n为每行的元素个数
for (i = 1; i <= n - 2; i++) { //利用队中第n-1行元素产生第n行的中间n-2个元素并入队
DeleteQueue(&q, &temp); //出队元素赋给temp
printf("%6d", temp); //打印第n-1行的元素
GetHead(&q, &x);
temp = temp + x; //利用第n-1行元素产生第n行元素
EnterQueue(&q, temp); //可以利用画图理解
}
DeleteQueue(&q, &x);
printf("%6d", x); //打印n-1行最后一个元素
EnterQueue(&q, 1);
printf("\n");
}
while (!IsEmpty(&q)) { //打印最后一行
DeleteQueue(&q, &x);
printf("%6d", x);
}
}
//主函数:
int main() {
int N;
printf("请输入想打印的行数:");
scanf("%d", &N);
YangHuiTriangle(N);
printf("\n");
return 0;
}