标签:间隔 int sum C++ 蓝桥 杨辉三角 观察 对应
*以下内容包含了详细注解,便于食用。 *
#include<iostream>
#include<stdlib.h>
using namespace std;
int main(){
int i,j; //循环变量
int n,sum; //接收行数 和 行数对应的数据个数
int *p; //数组
cin>>n;
sum=n* (1+n) / 2; //计算n行对应的数据个数
p=(int *)malloc(sizeof(int)*(sum+1)); //放弃P[0],从P[1]开始存储数
/*
首先把 杨辉三角两边的 1 全部赋值完成
左边部分的1:对应在数组中的下标位置为:1 2 4 7 11 ... ,可以观察到其间隔分别为 1 2 3 4....
所以可以将其转换为数学公式(从1开始,每次加上间隔数,就是当前的位置)即:
1 + ( (1-1) + i )* (i-1) //注意理解第i行 共有 i-1 项 间隔数
右边部分的1:由观察可知 它是左边部分的1 对应的坐标减一得到,所以可以写为:1 + ( (1-1) + i )* (i-1)
但是,要考虑到最后一项并不在这个公式里面,所以需要单独表示:p[sum] = 1;
*/
for( i = 2 ; i <= n ; i++ ){ //这里的i表示行数
p[ i*(i-1)/2 ] = 1;
p[ 1 + i*(i-1)/2 ] = 1;
}
p[sum]=1; //上述循环代码缺少最后一个数据,所以要补上
/*
把杨辉三角的内部补全:
由观察可知,杨辉三角内部的数字都是其头上的两个数字之和 ,并且观察其行列数,可发现:
第i行j列的数字(i>=3,1<j<i)= 第i-1行j-1列的数据 + 第i-1行第j列的数据
(因为 第i行对应的数据个数最多就是 i个,而第i个为每行的最后一个,所以一定为1,则 j 应该 < i )
最后因为:第i行j列的数据对应数组的下标位置应该是 前 i-1 行数据的总和 加上 j
即可完成以下代码
*/
for ( i = 3; i <= n; i++)
for ( j = 2; j < i; j++)
{
p[(i-1)*(i+1-1)/2+j] = p[(i-2)*(1+i-2)/2+(j-1)] + p[(i-2)*(1+i-2)/2+j] ;
}
/*
输出数据
*/
sum=1;
for(i=1;i<=n;i++){
for(j=0;j<i;j++)
printf("%d ",p[sum++]);
printf("\n");
}
return 0;
}
第一次写博客,不妥之处请多多指教!
标签:间隔,int,sum,C++,蓝桥,杨辉三角,观察,对应 来源: https://blog.csdn.net/qq_53214534/article/details/123589282
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。