注册 登录
编程论坛 新人交流区

[讨论]关于用C++实现杨辉三角形

toms 发布于 2007-11-16 19:19, 2334 次点击
用二维数组实现一个杨辉三角形,并显示出来.
如下,显示一个10行的杨辉三角.
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

下面是自己编的一个程序,总觉得这个程序有点复杂,想在这里请教一下各位高手,有没有更简单一些的.
由于本人水平有限,改了好久还是改不好.希望大家帮助.谢谢了.

#include<stdio.h>
int main()
{
int num[10][10]={1};
int i,j;
printf("%4d",num[0][0]);
for(i=1;i<=9;i++)
{
printf("\n");
for(j=0;j<=i;j++)
{
if(j>=1&&j<=i-1)
{
num[i][j]=num[i-1][j-1]+num[i-1][j];
printf("%4d",num[i][j]);
}
if(j==0)
{
num[i][j]=num[i-1][j];
printf("%4d",num[i][j]);
}
if(j==i)
{
num[i][j]=num[i-1][j-1];
printf("%4d",num[i][j]);
}
}
}
printf("\n");
return 0;
}

6 回复
#2
h130773959592007-11-16 19:54

你的程序很不错,杨辉三角的特点用上了。
可以试从另外的特点加以改进算法:

第一列和对较线都为1,可直接赋值1
第二列和紧靠对角线的斜边为123456789;
每一行的数字是对称的。

#3
h130773959592007-11-16 20:11
<引用别人结果,特此声明>
本程序应是根据以上递归的数学表达式编制的。
*程序说明与注释
#include<stdio.h>
int 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<24-2*i;j++) printf(" "); /*控制输出第i行前面的空格*/
for(j=1;j<i+2;j++) printf("%4d",c(i,j)); /*输出第i行的第j个值*/
printf("\n");
}
}

void int c(int x,int y) /*求杨辉三角形中第x行第y列的值*/
{
int z;
if((y==1)||(y==x+1)) return 1; /*若为x行的第1或第x+1列,则输出1*/
z=c(x-1,y-1)+c(x-1,y); /*否则,其值为前一行中第y-1列与第y列值之和*/
return z;
}
#4
StarWing832007-11-16 20:31
LS,人家要求用二维数组呢……虽然你用递归也很好……
#include<stdio.h>
int main(){
int a[10][10]={1},i,j;
for(i=0;i<10;i++){
for(j=0;j<=i;j++){
if(i==0 || j==0 || i==j)
a[i][j]=1;
else
a[i][j]=a[i-1][j-1]+a[i-1][j];
printf("%4d",a[i][j]);
}
putchar('\n');
}
getchar();
return 0;
}

这是我的答案,原理和LZ的一样。
#5
StarWing832007-11-16 20:56

抱歉啊,上面的程序的i==0其实是不需要的……现改过……
不过似乎浪费了一半的空间……用三角矩阵的方法可以解决这个问题,但是那样的话就不是二维数组了……你们老师出的题可真是毒啊,想优化都做不到……

#include<stdio.h>
int main() {
int a[10][10]={0},i,j;
for (i=0;i<10;i++) {
for (j=0;j<=i;j++) {
if (j==0 || i==j)
a[i][j]=1;
else
a[i][j]=a[i-1][j-1]+a[i-1][j];
printf("%4d",a[i][j]);
}
putchar('\n');
}
getchar();
return 0;
}




另外,LZ不是要简单精炼的代码吗?这里有个超精炼的,嘿嘿,只是玩玩,可千万别照我这么写……交作业还是可以的~~这个代码还随便做了下简单的输出排版,看着舒服点,纯粹的无聊之作(不过这也是我喜欢用printf而不是cout的原因之一)

#include<stdio.h>
void main() {
int a[10][10]={0},i,j;
for (i=0;i<10;putchar('\n'),i++)
for (j=0;j<=i;j++) {
a[i][j]=!j||i==j?1:a[i-1][j-1]+a[i-1][j];
printf("%*d",!j?10-i<<1:4,a[i][j]);
}
}

[此贴子已经被作者于2007-11-16 22:05:37编辑过]

#6
toms2007-11-17 12:03
回复:(StarWing83)抱歉啊,上面的程序的i==0其实是...

强悍,我改了那么久也没改出好的,居然你一下子就搞定了,看来我要好好象各位学习了,
尤其那个超级精练的代码,简直太完美了,我得好好学习学习.
实在太感谢了.谢谢了.

#7
lusan1682007-11-17 16:25
我觉得做这种题,要有比较好的,观察能力,嘿嘿
1