C++_洛谷P5732_杨辉三角 题解

本人第一次写题解,不喜勿喷

题目描述

给出 n,输出杨辉三角的前 n 行

输入格式

一行,一个正整数 n(1≤n≤20)

输出格式

杨辉三角——
共 n 行,第 i 行包含 i 个正整数,之间用一个空格隔开。

输入样例

5

输出样例

1 
1 1 
1 2 1 
1 3 3 1 
1 4 6 4 1

关于杨辉三角

杨辉三角,是二项式系数在三角形中的一种几何排列,中国南宋数学家杨辉1261年所著的《详解九章算法》一书中出现。
在欧洲,帕斯卡(1623----1662)在1654年发现这一规律,所以这个表又叫做帕斯卡三角形。帕斯卡的发现比杨辉要迟393年,比贾宪迟600年。1

思路

将杨辉三角中所有项储存在一个数组num中,如下:

1 1 1 2 1 1 3 3 1 1 4 6 4 1 ……

不难发现,
除第k行第一个和最后一个都是1外,其他的数的表达式为:

num[n]=num[n-k]+num[n-k+1]

所以,我们只需将num[0]、num[1]、num[2]手动赋值,再使用通项公式进行逐项求解即可~

代码

#include
using namespace std;
int num[220]={1,1,1};	//用来存放杨辉三角各项的数组
int n=0;	//要输出多少数
int main(){
	int i,t;	// t 为一共多少行
	cin>>t;
	for(i=1;i<=t;i++) n+=i;	//计算 n
	int k=3,tmp=1;
	//k 为行的借记变量(前两行已知)
	//tmp 为一行中第几个数的借记变量
	for(i=3;i<n;i++){
		if(tmp==1||tmp==k) num[i]=1;	//特判是否为第一个或最后一个数
		else num[i]=num[i-k]+num[i-k+1];
		tmp++;
		if(tmp>k){	//换行
			k++;
			tmp=1;	//重置
		}
	}
	k=1;tmp=1;	//重置,准备输出
	for(i=0;i<n;i++){
		cout<<num[i]<<" ";
		tmp++;
		if(tmp>k){
			k++;
			tmp=1;
			cout<<endl;
		}
	}
	return 0;
}

因为第一次写题解,码龄也不算很高,所以程序多少有点粗糙,敬请批判与谅解


  1. 摘自杨辉三角_百度百科 ↩︎

你可能感兴趣的:(c++)