杨辉三角 用c语言怎么编程

如题所述

杨辉三角的形状如下(因为百度知道不支持输出空格,故以空格间隔。)
********1********(a+b)^0("^"表示次方)
*******1*1*******(a+b)¹
******1*2*1******(a+b)²
*****1*3*3*1*****(a+b)³
****1*4*6*4*1****(a+b)^4
我们知道,杨辉三角形的特点是:每行的第一列为1,最后一列为1。从第三行开始,中间各列等于上一行中前列与本列的和。

可以看出,最后一列的列数正好等于行数(第n行有n个数)。
我们首先就想到,使用一个二重循环就可解决这个问题,但是其中有个问题需要解决,就是数字的位置。C语言中不能象PASCAL语言那样确定打印的坐标,但可以用空格来间接实现。认真观察一下就会发现,从第二行开始,每行的第一个数都比上一行左移一个位置,也就是说,每行第一个数之前的空格数逐行减去一个数字所占的列数。turbo c 2.0 以字符输出时,每行80个字符,我们把第一行的第一个数(本行就一个数即1)放在第40个字符的位置处,且规定第个数字占4列,第二行的第一个数要向左移8列(因为下一行的第n个数和上一行的第n个数不在同一列,即并不对齐,而是刚好错开一个字符的距离)

代码如下:
#define M 10
num(i,j)
int i,j;
{
if(i==j||j==0)
return(1);
else
return(num(i-1,j-1)+num(i-1,j));
}
main()
{
int n,i,j,k;
clrscr();
printf("输入要打印的行数n:(n<=M)");
scanf("%d",&n);
for(i=0;i<n;i++)
{
for(k=0;k<36-2*i;k++)/*因为每个数占4列,所以下一行要少打2个空格就刚好错开*/
printf(" ");
for(j=0;j<=i;j++)
printf("%4d",num(i,j));
printf("\n");
}
getch();
}
温馨提示:内容为网友见解,仅供参考
第1个回答  2008-09-25
在80字符的屏幕上输出杨辉三角,要求1在中间,形如 1 /*第0行 */
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
1 7 21 35 35 21 7 1
1 8 28 56 70 56 28 8 1
1 9 36 84 126 126 84 36 9 1

大家知道利用数组数组的方法输出杨辉三角是一件比较容易的事情,在许多的教材上都能够找到,而且计算速度比较快,但是有个缺点就是当输出的阶数比较大的时候,需要占用较多的存储空间。 下面我尝试用利用非数组的方法输出杨辉三角

1. 利用公式

学了高中数学我们就知道有公式(a+b)n =C0n a0bn+…+ Ckn akbn-k…+ Cnn anb0

杨辉三角的每一个元素都可以由公式计算出来Ckn akbn-k,有了这个公式我们就可以很快写出程序来。

/***************************************************

* 利用公式输出杨辉三角

* 编程:zheng 2004.10.27

* 程序在BCB6.0下编译通过

***************************************************/

#include "stdio.h"

static long factorial(long n)

{//n的阶乘

return n==0||n==1?1:n*factorial(n-1);

}//factorial

static long getelem(long n,long k)

{//利用公式计算杨辉三角的第row行,col列的元素

return factorial(n)/(factorial(n-k)*factorial(k));

}//getelem

void output(long n)

{//输出杨辉三角,n为杨辉三角的阶数

int row,col;

for(row=0;row<=n;row++)

{

for(col=0;col<=row;col++)

printf(" %5ld",getelem(row,col));

printf("n");

}//for

}//output

2.利用递归

观察下面的杨辉三角(你也可以用上面的性质,通过数学方法推导出来)

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

1 7 21 35 35 21 7 1

1 8 28 56 70 56 28 8 1

1 9 36 84 126 126 84 36 9 1

1 10 45 120 210 252 210 120 45 10 1

我们可以得到下面的性质(其实我们用数组的方法也是用这个性质)

1. 边界上的元素都是1

2. 中间的任何一个元素都是他的上一行的两个相邻元素的和

如果我们用f(n,k)表示杨辉三角的第n行的第k个元素,则上边的性质可以表示成

f(n,k) =1 (k=0或者n=k)

f(n,k) =f(n-1,k-1)+f(n-1,k)



Ckn akbn-k = 1 (k=0或者n=k)

Ckn akbn-k = Ckn akbn-k + Ckn akbn-k

有了上面的性质我们很容易写出下面的程序

/***************************************************

* 利用递归输出杨辉三角

* 编程:zheng 2004.10.27

* 程序在BCB6.0下编译通过

***************************************************/

#include "stdio.h"

static long factorial(long n)

{//n的阶乘

return n==0||n==1?1:n*factorial(n-1);

}//factorial

static long getelem(long n,long k)

{//利用递归计算杨辉三角的第row行,col列的元素

if (k==0||n==k) return 1;

else return getelem(n-1,k-1)+getelem(n-1,k);

}//getelem

void output(long n)

{//输出杨辉三角,n为杨辉三角的阶数

int row,col;

for(row=0;row<=n;row++)

{

for(col=0;col<=row;col++)

printf(" %5ld",getelem(row,col));

printf("n");

}//for

}//output

参考资料:从别的地方粘贴的,你自己也可以的 哈哈

第2个回答  推荐于2016-05-03
#include <stdio.h>

int c(x,y) //求杨辉三角形的第x行第y列的值
int x,y;
{
int z;
if((y==1)||(y==x+1)) //若为x行的第1或第x+1列,刚输出1
return (1);
z=c(x-1,y-1)+c(x-1,y);//否则,其值为前一行中第y-1列与第y列值之和
return (z);
}

void main()
{
int i,j,n=13;
printf("N=");
while(n>12)
scanf("%d",&n); //控制输入正确的值以保证屏幕显示的图形正确
for(i=0;i<=n;i++) //控制输出N行
{
//for(j=0;j<12-i;j++) //控制输出第i行前面的空格
//printf(" ");
for(j=1;j<i+2;j++) //输出第i行的第j个值
printf("%6d",c(i,j));
printf("\n");
}
}
第3个回答  2008-10-09
有很多可行的办法,用数组定义后用PUTS输出,也可以计算后用输出.如果你对算法不太熟、建议你去看一下<<算法+数据结构>>这本书,可以很好帮助你设计算法!
给你个实例吧:
#include<stdio.h>
main()
{
long i,j,n,k;
scanf("%ld",&n);
for(i=1;i<=n;i++)
{
k=1;
for(j=1;j<i;j++)
{
printf("%ld ",k);
k=k*(i-j)/j;
}
printf("1\n");
}
}
第4个回答  2008-09-25
#define N 13 //定义三角最大行,可自行设定,但最大不要超过65536;

#include <stdio.h>

main(){

int n,i,j;
int a[N+1][2*N+4];

printf("How Many Rows Do You Want:(Number Must Below Or Equal %d)\n",N);
scanf("%d",&n);
if(n>N){
printf("What You Input Is Big Than What We Provide!\n");
exit(1);
}

//初始化数组;
for(i=1;i<=n;i++){
for(j=-1;j<2*n+2;j++){
a[i][j]=0;
}
}

a[1][n]=1;

//设置杨辉三角的数值;
for(i=1;i<=n;i++){
for(j=1;j<2*n;j++){
if(a[i][j]!=0){
a[i+1][j-1]=a[i][j-2]+a[i][j];
a[i+1][j+1]=a[i][j+2]+a[i][j];
}
}
}

//打印杨辉三角;
for(i=1;i<=n;i++){
for(j=1;j<2*n;j++){

if(a[i][j]!=0){
printf("%3d",a[i][j]); //打印格式自设,如加“\t”或空格等;
} //主要是为了打印的图像美观;
else{
printf(" ");
}
if(j==(2*n-1)){
printf("\n");
}
}
}
}

C语言编程题 :打印出杨辉三角(十行)
C语言程序:include <stdio.h>#define ROW 10void main(){int arr[ROW][ROW];int i, j;for(i=0; i<ROW; i++)for(j=0; j<=i; j++)if(j==0 || i==j)arr[i][j] = 1;elsearr[i][j] = arr[i-1][j-1] + arr[i-1][j];for(i=0; i<ROW; i++){for(j=0;...

C语言,输出杨辉三角
修改:#include"stdio.h" void main(){int a[10][10],i,j;for(i=0;i<=9;i++){ a[i][0]=1;\/\/原代码此处需修改,第一位数为1 a[i][i]=1;}for(i=1;i=9;i++)for(j=1;j<i;j++)\/\/原代码此处需修改 a[i][j]=a[i-1][j-1]+a[i-1][j];for(i=0;i<=9;i...

C语言编程题 :打印出杨辉三角(十行)
C语言程序:include <stdio.h>#define ROW 10void main(){int arr[ROW][ROW];int i, j;for(i=0; i<ROW; i++)for(j=0; j<=i; j++)if(j==0 || i==j)arr[i][j] = 1;elsearr[i][j] = arr[i-1][j-1] + arr[i-1][j];for(i=0; i<ROW; i++){for(j=0;...

C语言编程输出杨辉三角形(要求输出10行)?
int main(){ int n,i,j,a[100];n=10;printf(" 1");printf("\\n");a[1]=a[2]=1;printf("%3d%3d\\n",a[1],a[2]);for(i=3;i<=n;i++){ a[1]=a[i]=1;for(j=i-1;j>1;j--)a[j]=a[j]+a[j-1];for(j=1;j<=i;j++)printf("%3d",a[j]);printf("\\...

c语言这种数字三角形怎么打出来?
类似杨辉三角形,代码如下,你可以做适当修改:include <stdio.h> void Print_Format (int a) { \/\/print blank int i; for (i =0; i0;i--){ \/\/ for (j=9; j>0; j++){ \/\/ a[i][0]=1;\/\/ a[i][i]=...

C语言 | 打印杨辉三角
在C语言中,我们可以通过编程实现打印杨辉三角。这个经典问题可以分解为三个步骤来理解。首先,处理三角形中的特殊数字,即每行的首尾元素都是1,这部分是赋值的基础。 其次,中间的数通过数学公式计算得出,它们的值取决于上一行的相邻元素。 最后,将这些赋值后的二维数组按行进行遍历,并以图形...

C语言中怎样用数组输出杨辉三角的前n行?
\/\/ 行数 i 从 2 到层高 for (i = 2; i <= h; s = 1, i++) {\/\/ 第一个 1 printf("1 "); \/\/ 列位置 j 绕过第一个直接开始循环 for (j = 1; j <= i - 2; j++) \/\/printf("%d ", (s = (i - j) \/ j * s)); printf("%d ", (s ...

c语言程序杨辉三角
void main(){ int a[10] = { 1 };for (int i = 0; i < 10; i++) \/\/用循环打印第一行 { if (a[i] == 0){ printf("%4c",' ');} else printf("%4d", a[i]);} \/\/先输出第一行之后再进行循环 for (int j = 2; j <= 10; j++){ printf("\\n"); \/\/...

@C语言大神,打印杨辉三角形的程序,为什么不对?求解释
include <stdio.h>#define N 10int main(){ int i,j,a[N][N]={0}; for(i=0;i<N;i++)\/\/你定义了N怎么不用 { for(j=0;j<=i;j++)\/\/j如果不小于等于i那后来的if怎么办 { if(i==j||j==0) a[i][j]=1; \/\/这里也可以是if(i==j)a[i][j...

C语言编程;打印杨辉三角的前十行,下面这个程序哪里错了??
a[i][0]=1; \/*第一列元素赋值为1*\/ 按你的思路,这个先改一下,另外,还有错,你可以再想想,如果不行,我再帮你看 --- for (i=2;i<=9;i++){for (j=1;j<i;j++) \/\/j<=i的话会跟原有已有值冲突了;a[i][j]=a[i-1][j]+a[i-1][j-1];} ...

相似回答