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

发布网友 发布时间:2022-04-23 10:04

我来回答

5个回答

热心网友 时间:2023-08-25 06:28

杨辉三角的形状如下(因为百度知道不支持输出空格,故以空格间隔。)
********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();
}

热心网友 时间:2023-08-25 06:28

在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

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

热心网友 时间:2023-08-25 06:29

#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");
}
}

热心网友 时间:2023-08-25 06:29

有很多可行的办法,用数组定义后用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");
}
}

热心网友 时间:2023-08-25 06:30

#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");
}
}
}
}

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com