本人第一次写题解,不喜勿喷
题目描述
给出 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<iostream>
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;
}
因为第一次写题解,码龄也不算很高,所以程序多少有点粗糙,敬请批判与谅解
摘自杨辉三角_百度百科 ↩︎