详解C语言用数组表示杨辉三角........

详解C语言用数组表示杨辉三角........,第1张

杨辉三角形的六种解法

杨辉三角形是形如

1

1 1

1 2 1

1 3 3 1

1 4 6 4 1

的三角形,其实质是二项式(a+b)的n次方展开后各项的系数排成的三角形,它的特点是左右两边全是1,从第二行起,中间的每一个数是上一行里相邻两个数之和。这个题目常用于程序设计的练习。

下面给出六种不同的解法。

解法一

#include <stdioh>

main()

{ int i,j,n=0,a[17][17]={0};

while(n<1 || n>16)

{ printf("请输入杨辉三角形的行数:");

scanf("%d",&n);

}

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

a[i][0]=1; /第一列全置为一/

for(i=1;i<n;i++)

for(j=1;j<=i;j++)

a[i][j]=a[i-1][j-1]+a[i-1][j];/每个数是上面两数之和/

for(i=0;i<n;i++) /输出杨辉三角/

{ for(j=0;j<=i;j++)

printf("%5d",a[i][j]);

printf("\n");

}

}

点评:解法一是一般最容易想到的解法,各部分功能独立,程序浅显易懂。

解法二

#include <stdioh>

main()

{ int i,j,n=0,a[17][17]={1};

while(n<1 || n>16)

{ printf("请输入杨辉三角形的行数:");

scanf("%d",&n);

}

for(i=1;i<n;i++)

{ a[i][0]=1; /第一列全置为一/

for(j=1;j<=i;j++)

a[i][j]=a[i-1][j-1]+a[i-1][j]; /每个数是上面两数之和/

}

for(i=0;i<n;i++) /输出杨辉三角/

{ for(j=0;j<=i;j++)

printf("%5d",a[i][j]);

printf("\n");

}

}

点评:解窢二是在解法一的基础上,把第一列置为1的命令移到下面的双重循环中,减少了一个循环。注意初始化数组的变化。

解法三

#include <stdioh>

main()

{ int i,j,n=0,a[17][17]={0,1};

while(n<1 || n>16)

{ printf("请输入杨辉三角形的行数:");

scanf("%d",&n);

}

for(i=1;i<=n;i++)

for(j=1;j<=i;j++)

a[i][j]=a[i-1][j-1]+a[i-1][j]; /每个数是上面两数之和/

for(i=1;i<=n;i++) /输出杨辉三角/

{ for(j=1;j<=i;j++) printf("%5d",a[i][j]);

printf("\n");

}

}

点评:解法三是在解法一、二的基础上,把第一列置为1的命令去掉了,注意初始化数组的变化。

解法四

#include <stdioh>

main()

{ int i,j,n=0,a[17][17]={0,1};

while(n<1 || n>16)

{ printf("请输入杨辉三角形的行数:");

scanf("%d",&n);

}

for(i=1;i<=n;i++)

{ for(j=1;j<=i;j++)

{ a[i][j]=a[i-1][j-1]+a[i-1][j]; /每个数是上面两数之和/

printf("%5d",a[i][j]); /输出杨辉三角/

}

printf("\n");

}

}

点评:解法四是在解法三的基础上,把计算和打印合并在一个双重循环中。

解法五

#include <stdioh>

main()

{ int i,j,n=0,a[17]={1},b[17];

while(n<1 || n>16)

{ printf("请输入杨辉三角形的行数:");

scanf("%d",&n);

}

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

{ b[0]=a[0];

for(j=1;j<=i;j++)

b[j]=a[j-1]+a[j]; /每个数是上面两数之和/

for(j=0;j<=i;j++) /输出杨辉三角/

{ a[j]=b[j]; /把算得的新行赋给a,用于打印和下一次计算/

printf("%5d",a[j]);

}

printf("\n");

}

}

点评:解法一到解法四都用了二维数组,占用的空间较多。而解法五只使用了两个一维数组。

解法六

#include <stdioh>

main()

{ int i,j,n=0,a[17]={0,1},l,r;

while(n<1 || n>16)

{ printf("请输入杨辉三角形的行数:");

scanf("%d",&n);

}

for(i=1;i<=n;i++)

{ l=0;

for(j=1;j<=i;j++)

{ r=a[j];

a[j]=l+r; /每个数是上面两数之和/

l=r;

printf("%5d",a[j]); /输出杨辉三角/

}

printf("\n");

}

}

点评:解法六只使用了一个一维数组和两个临时变量。

#include "stdioh"

#include "conioh"

void main()

{ int n,i,j,k,a[20][20];

printf("please enter a n :\n");

scanf("%d",&n);

for(i=1;i<=n;i++)

{a[i][1]=1;a[i][i]=1;}

for(i=3;i<=n;i++)

for(j=2;j<i;j++)

a[i][j]=a[i-1][j]+a[i-1][j-1];

for(i=1;i<=n;i++)

{ printf("\n");

for(j=1;j<=i;j++)

printf("%d ",a[i][j]);}

}

这个你输入6就出现你要的结果

你还可以输入其余数字 你输入几 就出现几行 最大为20行

#include&lt;stdioh&gt;

#defineN7//以7行7列为例

intmain()

{

inta[N][N];//N行N列的杨辉三角

inti,j;

for(i=0;i&lt;N;i++)//先赋值两边

{

a<i>[0]=1;

a<i><i>=1;

}

for(i=2;i&lt;N;i++)//计算中间的数值

{

for(j=1;j&lt;i;j++)

a<i>[j]=a[i-1][j-1]+a[i-1][j];

}

for(i=0;i&lt;N;i++)//输出部分

{

for(j=0;j&lt;i+1;j++)

printf("%d",a<i>[j]);

printf("\n");

}

}

运行效果:

扩展资料:

说明:

a<i>[j]=a[i-1][j-1]+a[i-1][j];该语句用于求中间值

表示:中间值等于上一行前一列的数加上上一行同一列的数

例图中6(a[4][2]位置)等于上行两个3(前a[3][1],后a[3][2])相加

即表示为:a[4][2]=a[3][1]+a[3][2]

相当于:a[4][2]=a[4-1][2-1]+a[4-1][2]

等价于:a<i>[j]=a[i-1][j-1]+a[i-1][j]

printf函数使用注意事项

1、域宽

%d:按整型数据的实际长度输出。

如果想输出指定宽度可以指定域宽,%md--&gt;m域宽,打印出来以后,在控制台上,显示m位;

如果我们要打印的数的位数如果超过我们设定m则原样输出;

如果我们要打印的数的位数如果小于我们设定的位数,则补空白,具体如下:

如果m为正数,则左对齐(左侧补空白);

如果m为负数,则右对齐(右侧补空白)。

2、转义字符

如果想输出字符"%",则应该在“格式控制”字符串中用连续两个%表示。

如:printf("%f%%",10/3);输出结果:0333333%。

/杨辉菱形/

#include<stdioh>

main()

{

int i,k,j,a[5][5]={{1},{1,1}}; / 可改变数组大小来改变菱形的大小 /

for(i=2;i<=5;i++)

{

for(j=0;j<=i;j++)

if((j==0)||(j==i))

a[i][j]=1;

else

a[i][j]=a[i-1][j]+a[i-1][j-1];

}

for(i=0;i<5;i++) /该循环输出正三角/

{

printf("\n");

for(k=0;k<=30-2i;k++)

{

printf(" ");

}

for(j=0;j<=i;j++)

printf("%4d",a[i][j]);

}

for(i=3;i>=0;i--) /该循环输出倒三角/

{

printf("\n");

for(k=0;k<=22+2(4-i);k++)

{

printf(" ");

}

for(j=0;j<=i;j++)

printf("%4d",a[i][j]);

}

getch();

}

#include<stdioh>

void main()

{

int a[10][10];

int i,j;

for(i=0;i<10;i++)

{

for(j=0;j<=i;j++)//循环的控制出问题

{

if(j==0||j==i)

{

a[i][j]=1;

}

else

{

a[i][j]=a[i-1][j]+a[i-1][j-1];

}

printf("%-5d",a[i][j]);

}

printf("\n");

}

}

#include<stdioh>

#include<stdlibh>

#define MAXSIZE 20

typedef struct

{ int datas[MAXSIZE];

int front,rear;

}SqQueue;

//初始化队

void InitQueue(SqQueue Q)

{ Q->front=Q->rear=-1;

}

int EmptyQueue_C(SqQueue Q)

{//若队列为空,返回1,否则返回0

if(Q->rear==Q->front) return 1;

else return 0;

}//EmptyQueue_C

// 取对头元素

char GetQueue_C(SqQueue Q)

{//若队列不为空,则返回队首元素,否则返回NULL

int e;

if(EmptyQueue_C(Q))

{printf("Queue is empty\n");

return(0);}

else

{e=Q->datas[(Q->front+1)%MAXSIZE];

return e;}

}//GetQueue_C

//入队

int EnQueue_C(SqQueue Q, int e)

{//将元素e插入到队列中,作为新的队尾。 *** 作成功返回1,否则返回0

if(Q->front==(Q->rear+1)%MAXSIZE)//队满

{printf("Queue is full\n");

return 0;}

else

{Q->rear=(Q->rear+1)%MAXSIZE;

Q->datas[Q->rear]=e;

return 1;}

}//EnQueue_C

//出队

int DeQueue_C(SqQueue Q)

{ //删除队头元素,若 *** 作成功返回1,否则返回0

if(EmptyQueue_C(Q))

{printf("Queue is empty\n");

return 0;}

else

{Q->front=(Q->front+1)%MAXSIZE;

return 1;}

}//DeQueue_C

//输出队

void PRINT(SqQueue Q)

{

int i;

if(Q->front!=Q->rear)

{

printf("当前循环队列中从头到尾的元素为:");

i=Q->front;

while(i!=Q->rear)

{

i=(i+1)%MAXSIZE;

printf("%d ",Q->datas[i]);

}

}

else

printf("当前循环队列为空!");

putchar('\n');

}

main()

{

SqQueue Q;

int n;

int i,j,k,s1,s2;

Q=(SqQueue )malloc(sizeof(SqQueue));

InitQueue(Q);

EnQueue_C(Q,1);

printf("请输入杨辉三角的层数:\n");

scanf("%d",&n);

for(i=1;i<(n-1)3+2;i++)

printf(" ");

printf("%-3d\n",1);

for(i=2;i<=n;i++)

{

for(k=0;k<(n-i)3+1;k++)

printf(" ");

for(j=1,s1=0;j<i;j++)

{

int s2;

s2=GetQueue_C(Q);

DeQueue_C(Q);

printf("%-3d",s1+s2);

printf(" ");

EnQueue_C(Q,s1+s2);

s1=s2;

}

printf("%-3d",1);

EnQueue_C(Q,1);

printf("\n");

}

}

你试下这个

以上就是关于详解C语言用数组表示杨辉三角........全部的内容,包括:详解C语言用数组表示杨辉三角........、C语言编写 用数组输出杨辉三角六行、C语言编写程序,打印一个7行的杨辉三角形等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9453284.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-28
下一篇 2023-04-28

发表评论

登录后才能评论

评论列表(0条)

保存