C语言程序设计漫谈之从“杨辉三角形”谈起
c语言-杨辉三角的两种输出方法

c语⾔-杨辉三⾓的两种输出⽅法c语⾔对杨辉三⾓的简单实现杨辉三⾓是数字与⼏何的完美融合,杨辉三⾓有着⾮常神奇的排列规律。
下⾯我们来复习以下杨辉三⾓形的特性,并⽤程序来输出杨辉三⾓形。
11 11 2 11 3 3 11 4 6 4 1如上,可以看出⼀个很简单的规律:每个数等于它上⽅两数之和。
每⾏数字左右对称,由1开始逐渐变⼤。
第n⾏的数字有n项。
利⽤这三个规律,我们可以⽤数组来实现杨辉三⾓的排列。
#include <stdio.h>#define N 14void main(){int i, j, k, n, arr[N][N]; /*定义⼆维数组arr[14][14]*/do{printf("请输⼊要打印的⾏数:");scanf("%d",&n);}while(n<=0||n>=N-1); //对打印⾏数进⾏判断,避免越界for(i=1;i<=n;i++)a[i][1] = a[i][i] = 1; //两边的数令它为1,因为现在循环从1开始,就认为a[i][1]为第⼀个数for(i=3;i<=n;i++)for(j=2;j<=i-1;j++)a[i][j]=a[i-1][j-1]+a[i-1][j]; //除两边的数外都等于上⽅两数之和for(i=1;i<=n;i++){for(k=1;k<=n-i;k++)printf(" "); //对打印进⾏排版for(j=1;j<=i;j++)printf("%6d",a[i][j]);printf("\n");}return 0;}以上就是数组对杨辉三⾓的实现,如果不想使⽤数组还可以利⽤以下规律,进⾏直接打印。
第n⾏的m个数可表⽰为 C(n-1,m-1),即为从n-1个不同元素中取m-1个元素的组合数。
杨辉三角形最简单的c语言

杨辉三角形最简单的c语言杨辉三角形是一种有趣而又常见的几何图形,在数学和计算机科学领域都有着广泛的应用。
它以及它衍生出来的一些数列和其它数学结构具有极大的意义,为科学家和数学家们建立起了一个丰富多面的领域,也为后人们提供了海量的探索空间。
在计算机领域,c语言是一种广泛使用的语言,也因为它独特的特性常被用于解决各种计算机科学问题。
杨辉三角也是其中的一个,今天我们就来学习一下用c语言如何来编程构造杨辉三角形。
首先我们应该先了解一下什么是杨辉三角,杨辉三角是由一列从1开始的自然数组成的,每个数字等于它上方两数之和,组成的一般性数组。
在数学上,它的表示方式有了很多种,其中最简单的表示方式就是:11 11 2 11 3 3 11 4 6 4 1…在编程语言中,要构造出杨辉三角形,一般都采用的是先定义一个二维数组,然后通过一个循环来给二维数组赋值,使其元素构成杨辉三角形。
首先看下用c语言构造一个5行5列的杨辉三角形:int yanghui[5][5]for (int i=0; i<5; i++){for (int j=0; j<=i; j++){if (i==j || j==0)yanghui[i][j] = 1;elseyanghui[i][j] = yanghui[i-1][j-1] + yanghui[i-1][j];printf(%dyanghui[i][j]);printf(t}printf(}其中,第一步定义一个5行5列的二维数组,以存放杨辉三角形的结果;第二步,通过一个两层循环来让我们得到那个二维数组;第三步,用一个if语句把只有一个元素的行赋值为1;第四步,用一个else语句来把其他元素赋值为它上方两个元素之和;最后,用printf语句把我们定义好的二维数组打印出来。
通过这段程序,我们可以看到,用c语言构造杨辉三角形是十分简单的,只要我们理解它的原理并跟着步骤一步步来操作,就可以很容易的构造出杨辉三角形。
C语言上机杨辉三角形算法思路提示

杨辉三角形编程算法思路提示
程序算法思考过程:
观察杨辉三角形的数字,可发现对于每一行上的数字而言,除了第1列和最后1列外,其它均为上一行的当前列和前一列的数字之和。
因而在程序设计中需要保存上一行的相关数字以备计算。
要保存上一行的数字就需要定义变量用于保存。
但是,由于每一行的数字个数不同,所以所需的变量个数也会因为行数不同而不同。
解决这一问题更简单的方法是使用数组和指针。
由于数组和指针的内容还未学习,所以,在现有所学知识的基础上编程实现此问题需要思考其他可能的方法。
解决问题的关键在于找出每一行中对应的每一列上数字与所在行号和列号之间可能存在的关系。
设用i表示行号,j表示列号,t表示第i行、第j列上对应的数字,仔细观察,可发现如下计算规律:
对于每一行而言:
①第1列上的数字的初始值为1,即t=1。
②从第2列开始:t=t*(i-j+1)/(j-1)
(下图中以第5行为例,给出了计算过程)
综合上述分析,使用两层循环来实现这一算法。
外层循环控制行号,假设输出6行,则外层
循环从1到6;对于内层循环,第i行则有供有i列数据(即第1行1列,第2行2列,第3行3列)。
而在输出每一行时,第1列t的值总是1,之后内层用于控制列号的循环从2开始一直到i,根据上述公式计算输出。
可以通过转义字符\t或空格控制输出的格式。
如下图所示。
杨辉三角形 c语言 -回复

杨辉三角形c语言-回复杨辉三角形是一个数学上非常有趣的图形,它以数列的形式展现了一种规律,也可以用来解决许多实际问题。
在本文中,我将向大家介绍如何使用C语言来生成和打印杨辉三角形。
第一步,我们需要先了解什么是杨辉三角形。
它实际上是一个由数字组成的三角形,其中的数字满足以下规律:每个数字都等于它上方两个数字的和。
起始和结尾处的数字都是1。
而其余位置的数字等于它上方两个数字之和。
这个图形如下所示:11 11 2 11 3 3 11 4 6 4 1第二步,我们需要确定生成杨辉三角形的规模。
规模指的是三角形的行数。
在C语言中,我们可以使用一个整数变量来表示规模。
在下面的代码中,我们定义了一个名为`printPascalTriangle`的函数来生成和打印杨辉三角形。
该函数接受一个参数来表示杨辉三角形的规模,并根据规模来生成相应的三角形。
cinclude <stdio.h>void printPascalTriangle(int size) {int triangle[size][size];初始化三角形for (int i = 0; i < size; i++) {for (int j = 0; j <= i; j++) {if (j == 0 j == i) {triangle[i][j] = 1;} else {triangle[i][j] = triangle[i-1][j-1] + triangle[i-1][j];}}}打印三角形for (int i = 0; i < size; i++) {for (int j = 0; j <= i; j++) {printf("d ", triangle[i][j]);}printf("\n");}}int main() {int size;printf("请输入杨辉三角形的规模:");scanf("d", &size);printPascalTriangle(size);return 0;}让我们逐步分析上述代码。
C语言杨辉三角(两种方法)

C语言杨辉三角(两种方法)杨辉三角是我们从初中就知道的,现在,让我们用C语言将它在计算机上显示出来。
在初中,我们就知道,杨辉三角的两个腰边的数都是1,其它位置的数都是上顶上两个数之和。
这就是我们用C语言写杨辉三角的关键之一。
在高中的时候我们又知道,杨辉三角的任意一行都是的二项式系数,n 为行数减1。
也就是说任何一个数等于这个是高中的组合数。
n 代表行数减1,不代表列数减1。
如:第五行的第三个数就为=6。
现在我们按第一种思路来写:先定义一个二维数组:a[N][N],略大于要打印的行数。
再令两边的数为1,即当每行的第一个数和最后一个数为1。
a[i][0]=a[i][i-1]=1,n 为行数。
除两边的数外,任何一个数为上两顶数之和,即a[i][j] = a[i-1][j-1] + a[i-1][j]。
最后输出杨辉三角。
代码如下:1.#include<stdio.h>2.#define N 143.void main()4.{5.int i, j, k, n=0, a[N][N];/*定义二维数组a[14][14]*/6.while(n<=0||n>=13){/*控制打印的行数不要太大,过大会造成显示不规范*/7.printf("请输入要打印的行数:");8.scanf("%d",&n);9.}10.printf("%d行杨辉三角如下:\n",n);11.for(i=1;i<=n;i++)12. a[i][1]= a[i][i]=1;/*两边的数令它为1,因为现在循环从1开始,就认为a[i][1]为第一个数*/13.for(i=3;i<=n;i++)14.for(j=2;j<=i-1;j++)15. a[i][j]=a[i-1][j-1]+a[i-1][j];/*除两边的数外都等于上两顶数之和*/16.for(i=1;i<=n;i++){17.for(k=1;k<=n-i;k++)18.printf(" ");/*这一行主要是在输出数之前打上空格占位,让输出的数更美观*/19.for(j=1;j<=i;j++)/*j<=i的原因是不输出其它的数,只输出我们想要的数*/20.printf("%6d",a[i][j]);21.22.printf("\n");/*当一行输出完以后换行继续下一行的输出*/23.}24.printf("\n");25.}运行结果:上面的这一种方法我们用到了二维数组,下面的这一方法我们将用到自定义函数。
杨辉三角c语言程序

杨辉三角c语言程序一、什么是杨辉三角杨辉三角(Pascal's triangle)是由17世纪的法国数学家杨辉发现的排列数学问题,它是一个二项式系数的三角形,也是许多数学问题的模式,加法、减法、乘法、指数等等。
通俗地说杨辉三角就是一个由数列组成的三角形,上面的每一行开头和末尾代表1,然后从第3行开始,每一行中间的数都是其上面的,所以台一行中的数都等于上一行它左上/右上+1。
二、杨辉三角的基本理论1、二项式系数:任意二项式的系数都可以由杨辉三角推导出来。
2、关于二次函数:任意的二次函数的解,都可以由杨辉三角得出。
3、有关指数:任何指数的表达式可以由杨辉三角表示出来,使具有简洁的表达形式。
4、数列之和:任意一个数列的和可以由杨辉三角计算出来。
5、有关概率:任意两个事件出现的概率关系也可以由杨辉三角推出来。
三、杨辉三角的特殊元素1、杨辉三角中最重要的是第一行和最后一行,这一行全部为1.2、它的每一行第一个和最后一个数字都是1.3、每行由上到下依次递增,每行有(n+1)个数字。
4、对称性:每行第一个数字加上最后一个数字等于下一行的第一个数字。
5、连续性:任意一行的任意一个数字,都可以由前一行的一对相邻的数字得出。
6、诱导公式:任意一个数字都等于(i-j)行,第j个数字加上(i-j-1)行,第i个数字之和。
四、杨辉三角的应用杨辉三角可用于解决幂等问题、排列组合问题,可用来计算阶乘,并可用于统计学中的高斯分布的极大似然估计法,以及量子力学、天文学、应力矩计算、气动学运算等等。
五、杨辉三角的总结杨辉三角是一个数学模型,它的每一行的第一个与最后一个数字都是1,其它的数字等于它上面的两个数字之和。
它有许多应用,可以用于求解各种数学模型,如差分方程、数列和机率,也可以用于实际应用中,如分析传热、涡轮增压活塞运动等。
C语言杨辉三角两种实现方法

C语⾔杨辉三⾓两种实现⽅法⽬录杨辉三⾓——C语⾔实现⽅法⼀:利⽤⼆维数组实现⽅法⼆(对⽅法⼀的改进):总结杨辉三⾓——C语⾔实现杨辉三⾓:在屏幕上打印杨辉三⾓。
11 11 2 11 3 3 1……根据上述例⼦可知:1.每⼀⾏的第⼀个和第⼆个数为1;2.其余的数为正上⽅和左边数字之和。
⽅法⼀:利⽤⼆维数组实现解题思路:根据杨辉三⾓的规律,我们可以定义⼀个⼆维数组来实现杨辉三⾓的打印,其中数字的规律为:data[i][j] = data[i - 1][j] + data[i - 1][j - 1],所以我们按照这个⽅法将数据填⼊⼆维数组之后打印即可。
代码如下:#include <stdio.h>int main(){int n;int data[30][30] = {1};//将第⼀⾏直接填好,为1printf("请输⼊要打印的⾏数:>");scanf("%d", &n);for (int i = 1; i < n; i++)//从第⼆⾏开始填{data[i][0] = 1;//将每⼀⾏第⼀列先初始化为1,防⽌越界for (int j = 1; j < i + 1; j++){data[i][j] = data[i - 1][j] + data[i - 1][j - 1];}}for (int i = 0; i < n; i++)//打印⼆维数组{for (int j = 0; j < i + 1; j++){printf("%d ", data[i][j]);}printf("\n");}return 0;}运⾏结果:⽅法⼆(对⽅法⼀的改进):由于我在填第n⾏的杨辉三⾓时,只跟第n-1⾏的杨辉三⾓产⽣联系,不会跟之前的有联系,所以没必要保存每⼀⾏的杨辉三⾓,利⽤⼀维数组,填⼀⾏打⼀⾏即可,这样能让空间复杂度从O(n^2)降低到O(n)。
用C语言写杨辉三角

#include <stdio.h>#include <stdlib.h>#include <e:\06.h>/*创建一个空的循环队*/PSeqQueue createEmptyQueue(int m){PSeqQueue p;p=(PSeqQueue)malloc(sizeof(struct SeqQueue));p->q=(DataType)malloc(sizeof(DataType)*m);if(p&&p->q!=NULL){p->MAXNUM=m;p->f=0;p->r=0;return p;}else printf("Out of space!!\n");return NULL;}/*判断队列是否是空队*/int isEmptyQueue_seq(PSeqQueue p){if(p->f==p->r) return 1;else return 0;}/*元素入队*/void enQueue_seq(PSeqQueue p,DataType x){if ( ( p ->r + 1) %p-> MAXNUM == p ->f)printf( "Full queue.\n" );else {p->q[ p->r] = x;p ->r = ( p ->r + 1) % p->MAXNUM;}}/*元素出队*/void deQueue_seq(PSeqQueue p){if ( p->f == p->r )printf( "Empty Queue.\n" );elsep->f = (p->f + 1) % p->MAXNUM;}/*当队列不为空时,取队头元素*/DataType frontQueue_seq(PSeqQueue p){if ( p->f == p->r )printf( "Empty Queue.\n" );elsereturn ( p->q[ p->f ]);}/*打印杨辉三角*/void YangHuiTriangle ( int N ){PSeqQueue p;int temp,new,i=1,m,n,j;printf("请输入要创空队的长度m\n");scanf("%d",&m);p=createEmptyQueue(m); /*创建一个大小为m的空队列*/printf("打印的%d行杨辉三角\n",N);enQueue_seq(p,1); /*第一行元素入队*/if(N==1) printf("%5d\n",i);else {for(j=0;j<N;j++)printf(" ");for(n=2;n<=N+1;n++){/*产生第n行元素并入队,同时打印第n-1行的元素*/enQueue_seq(p,1); /*第n行的第一个元素入队*/for(i=1;i<=n-2;i++){/*利用队中第n-1行元素产生第n行中间n-2元素并入队*/temp=frontQueue_seq(p); /*读队首元素到temp*/deQueue_seq(p); /*删除队首元素*/printf("%6d",temp); /*打印第n-1行元素*/new=frontQueue_seq(p); /*读队首元素到new*/temp=temp+new; /*利用队中第n-1行元素产生第n行元素*/enQueue_seq(p,temp); /*第n行元素入队*/}temp=frontQueue_seq(p); /*第n-1行最后一个出队*/deQueue_seq(p);printf("%6d\n",temp);/*打印第n-1行的元素*/for(j=i;j<N;j++)printf(" ");enQueue_seq(p,1); /*第n行最后一个元素入队*/}}}main(){int N,order=1;while(order){printf("请输入要打印的杨辉三角行数N\n");scanf("%d",&N);YangHuiTriangle (N);printf("继续打印请输入1,停止输入0,请输入:");scanf("%d",&order);}}。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
从“杨辉三角形”谈起杨辉三角是二项式系数在三角形中的一种几何排列,中国南宋数学家杨辉1261年所著的《详解九章算法》一书中出现。
在欧洲,帕斯卡(1623~1662)在1654年发现这一规律,所以这个表又叫做帕斯卡三角形。
帕斯卡的发现比杨辉要迟393年。
如果将(a+b)n(n为非负整数)的每一项按字母a的次数由小到大排列,就可以得到下面的等式:(a+b)0=1 ,它只有一项,系数为1;(a+b)1=a+b ,它有两项,系数分别是1,1;(a+b)2=a2+2ab+b2,它有三项,系数分别是1,2,1;(a+b)3=a3+3a2b+3ab2+b3,它有四项,系数分别是1,3,3,1;……由此,可得下面的图表,这个图表就是杨辉三角形。
观察上图表,我们发现每一行的首末都是1,并且下一行的数比上一行多1个,中间各数都写在上一行两数中间,且等于它们的和,可以按照这个规律继续将这个表写下去。
【例1】杨辉三角形。
输入n(1<=n<=30),输出杨辉三角形的前n行。
(1)编程思路1。
用一个二维数组y[31][31] 来保存杨辉三角形每一行的值。
杨辉三角形第row行可以由第row-1行来生成。
例如:由上表知:当row=5时,y[5][1] = 1,y[5][2] = y[4][1] + y[4][2],y[5][3] = y[4][2] + y[4][3],y[5][4] = y[4][3] + y[4][4] ,y[5][5] = y[4][4] + y[4][5]一般的,对于第row(1~30)行,该行有row+1个元素,其中:y[row][1]=1第col(2~row+1)个元素为:y[row][col] = y[row-1][col-1] + y[row-1][col]。
(2)源程序1。
#include <stdio.h>int main(){int n,i,j,y[31][31]={0};for (i=1;i<=30;i++) // 赋行首与行尾元素值为1y[i][1]=y[i][i]=1;for (i=3;i<=30;i++) // 每行中间元素赋值for (j=2;j<i;j++)y[i][j]=y[i-1][j-1]+y[i-1][j];while (scanf("%d",&n)!=EOF){for (i=1;i<=n;i++){for (j=1;j<=i;j++){if (j!=1) printf(" ");printf("%d",y[i][j]);}printf("\n");}printf("\n");}return 0;}(3)编程思路2。
用一个一维数组y[30] 来保存杨辉三角形某一行的值。
杨辉三角形第row行可以由第row-1行来生成。
由上表知:当row=4时,y[4] = y[4]+y[3], y[3] = y[3]+y[2],y[2] = y[2]+y[1] , y[1] = y[1]+y[0],y[0]=1一般的,对于第row(0~9)行,该行有row+1个元素,第col(row~1)个元素为:y[col]=y[col]+y[col-1],y[0]=1(4)源程序2。
#include <stdio.h>#include <string.h>int main(){int y[30],row,col,n;while (scanf("%d",&n)!=EOF){memset(y,0,sizeof(y)); // 数组元素初始化为0y[0]=1;printf("%d\n",y[0]);for (row=1;row<n;row++){for (col=row;col>=1;col--)y[col]=y[col]+y[col -1];for (col=0;col<=row;col++){if (col!=0) printf(" ");printf("%d",y[col]);}printf("\n");}printf("\n");}return 0;}将上面的两个源程序提交给HDU 2032“杨辉三角”,均可以Accepted。
下面我们进一步讨论一下杨辉三角形。
我们根据杨辉三角形前16行中每个数的奇偶性决定是否输出一个特定字符。
比如如果是奇数,输出一个“*”号;是偶数,输出一个空格。
编写如下的程序:#include <stdio.h>int main(){int n,i,j,y[17][17]={0};for (i=1;i<=16;i++) // 赋行首与行尾元素值为1y[i][1]=y[i][i]=1;for (i=3;i<=16;i++) // 每行中间元素赋值for (j=2;j<i;j++)y[i][j]=y[i-1][j-1]+y[i-1][j];for (i=1;i<=16;i++){for (j=1;j<=i;j++)if (y[i][j]%2==1) printf("* ");else printf(" ");printf("\n");}return 0;}运行上面的程序,可以得到如下的运行结果。
运行结果的图形是一个递归深度为4的三角形。
通过这个图形,我们感觉杨辉三角形中每个数字的奇偶应该满足一定的规律。
组合数C(n,m)是指从n个元素中选出m个元素的所有组合个数。
其通用计算公式为:C(n,m)=n!/[m!*(n-m)!] C(0,0)=1 C(1,0)=1 C(1,1)=1从n个元素中取m个元素,考虑第n个元素,有两种情况:(1)不取。
则必须在前n-1个元素中取m个元素,方案数为C(n-1,m);(2)取。
则只需在前n-1个元素中取m-1个元素,方案数为C(n-1,m-1)。
因此, C(n,m)=C(n-1,m)+C(n-1,m-1)这正好符合杨辉三角形的递推公式。
即杨辉三角中第i行第j列的数字正是C(i,j)的结果。
因此,下面对杨辉三角形中各行各列数字的讨论转化为对组合数C(n,m)的讨论。
【例2】组合数的奇偶性。
(POJ 3219)二项式系数C(n, m)因它在组合数学中的重要性而被广泛地研究。
二项式系数可以如下递归的定义:C(1, 0) = C(1, 1) = 1;C(n, 0) = 1 对于所有n > 0;C(n, m) = C(n-1, m-1) + C(n-1, m) 对于所有0 < m ≤ n。
给出n和k,确定C(n, m)的奇偶性。
(1)编程思路1。
对于给定C(n,m),检查n!中2因子的个数与m!和(n-m)!中2因子个数和的关系,假设n!中2因子个数为a,m!中2因子个数为b,(n-m)!中2因子个数为c,则显然有a>=(b+c);并且当a==b+c时,一定为奇,否则为偶。
(2)源程序1。
#include <stdio.h>int getTwo(int x) // x!中2的因子的个数{int cnt=0;while (x/2!=0){cnt += x/2;x=x/2;}return cnt;}int main(){int n,k;while (scanf("%d%d", &n,&k)!=EOF){if (getTwo(n)-getTwo(k)-getTwo(n-k)>0)printf("0\n");elseprintf("1\n");}return 0;}(3)编程思路2。
前面通过杨辉三角形中数字的奇偶性输出“*”图时,我们感觉其数字的奇偶性与数字所在的行号和列号有一定的关系,即组合数C(n,m)的奇偶性与n和m有对应关系。
根据网络上的资料,给出结论如下:组合数的奇偶性判定方法为:对于C(n,m),若n&m == m 则C(n,m)为奇数,否则为偶数。
这个结论可以采用数学归纳法进行证明,在这里省略证明方法。
感兴趣的读者可以查阅相关资料。
在此知道结论好了!(4)源程序2。
#include <stdio.h>int main(){int n,k;while (scanf("%d%d", &n,&k)!=EOF){if ((n&k)==k)printf("1\n");elseprintf("0\n");}return 0;}根据组合数的奇偶性判定方法: 对于C(n,m),若n&m == m 则C(n,m)为奇数,否则为偶数。
可以写出如下一个程序。
#include <stdio.h>int main(){int n,i,j;while (scanf("%d",&n) && n!=0)for (i=0;i<(2<<(n-1));i++){for (j=0;j<=i;j++)if ((i&j)==j) printf("* ");else printf(" ");printf("\n");}}return 0;}运行这个程序,输入4,可以得到前面所示的星号图形。
有一次,我在网上随意浏览时,发现上面这个程序,当时觉得有些奇妙,有些小神奇。
因为,要输出一个递归形式的星号图形,我习惯性地采取递归的方法。
例如,为达到上面程序的功能,根据输入的n,输出相应的递归图形,我会编写如下的程序:#include <stdio.h>#define N 64void draw(char a[][N], int n, int row, int col){if(n==1){a[row][col] = '*';return;}int w = 1;int i;for(i=1; i<=n-2; i++) w *= 2;draw(a, n-1, row, col);draw(a, n-1, row+w, col+w);draw(a, n-1, row+w,col);}{char a[N][N];int n,w,i,j;while (scanf("%d",&n) && n!=0){for(i=0;i<N;i++)for(j=0;j<N;j++)a[i][j] = ' ';w=1;for(i=1; i<=n-1; i++) w *= 2;draw(a,n,0,0);for(i=0; i<w; i++){for(j=0; j<w; j++)printf("%c ",a[i][j]);printf("\n");}}return 0;}一个简单的二重循环即可完成递归图形的描绘,我当时还琢磨半天,怎么会这样?怎么想出来的?怎么会这样,我现在明白了,组合数的奇偶性判断规则。