SWUST OJ 966:打印杨辉三角形(C语言 循环队列实现)

据说数据结构考试必须用学的这些数据结构,所以就老老实实写了,没有用规律,STL容器之类的,博主的码风太丑,不喜勿喷

题目描述

杨辉三角形具有如下特征:1、每行数字左右对称,由1开始逐渐变大,然后变小,回到1。 2、第n行的数字个数为n个。 3、第n行数字和为2^(n-1)。 4、每个数字等于上一行的左右两个数字之和。可用此性质写出整个帕斯卡三角形。 5、将第2n+1行第1个数,跟第2n+2行第3个数、第2n+3行第5个数……连成一线,这些数的和是第2n个斐波那契数。将第2n行第2个数,跟第2n+1行第4个数、第2n+2行第6个数……这些数之和是第2n-1个斐波那契数。 6、第n行的第1个数为1,第二个数为1×(n-1),第三个数为1×(n-1)×(n-2)/2,第四个数为1×(n-1)×(n-2)/2×(n-3)/3…依此类推。例如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

输入

输入要打印的杨辉三角形的阶n。

输出

打印出n阶杨辉三角形。

基本思路

用一个循环队列储存一行,计算下一行时从队头(front)取两个元素求和放入队尾(rear),覆盖上一行的数据并输出。
注意:从第2行的第二个元素开始,所有元素均会被用到两次。

AC代码

//基本思路:每次出队2个元素,加起来后入队 
#include
int main()
{
	int n,front=0,rear=0;//定义阶数,队头,队尾 
 	scanf("%d",&n);//输入阶数 
 	int cqueue[n];//定义循环队列
 	for(int t=1;t<=n;++t)//逐行输出 
 	{
 		if(t==1)//如果是第一行的话无需入队 直接输出 
 			printf("1 \n");
 		else if(t==2)//第二行
 		{
 			cqueue[front%n]=1;
   			cqueue[++rear%n]=1;
   			for(int i=front;i<=rear;++i)
   				printf("%d ",cqueue[i]);
  			printf("\n");
  		}
  		else//行数大于2
  		{
  			for(int i=1;i<t;++i)//i表示第t行的第i个元素 
  			{
  				if(i==1)//每行的第一个位置输出1 
   					printf("%d ",cqueue[front]);
    			if(i==t-1)//每行的最后一个数设置为1
  				{
   					rear=(rear+1)%n;
   					cqueue[rear]=1;
  				}
 				else//首先rear后移一位,用front和front+1位的元素计算rear位上元素值 
    			{
     				rear=(rear+1)%n;
     				cqueue[rear]=cqueue[front]+cqueue[(front+1)%n]; 
     				front=(front+1)%n;
   				}
    			printf("%d ",cqueue[rear]);
   			}
   			printf("\n");
  		}
	 }
	return 0;
}

传送门:

swust oj 966.打印杨辉三角形

你可能感兴趣的:(SWUST,OJ题解,c语言,队列)