杨辉三角形是形如
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<stdioh>
#defineN7//以7行7列为例
intmain()
{
inta[N][N];//N行N列的杨辉三角
inti,j;
for(i=0;i<N;i++)//先赋值两边
{
a<i>[0]=1;
a<i><i>=1;
}
for(i=2;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+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-->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行的杨辉三角形等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)