[讨论]关于用C++实现杨辉三角形
用二维数组实现一个杨辉三角形,并显示出来.<BR>如下,显示一个10行的杨辉三角.<BR>1<BR>1 1<BR>1 2 1<BR>1 3 3 1<BR>1 4 6 4 1<BR>1 5 10 10 5 1<BR>1 6 15 20 15 6 1<BR>1 7 21 35 35 21 7 1<BR>1 8 28 56 70 56 28 8 1<BR>1 9 36 84 126 126 84 36 9 1<BR><BR>下面是自己编的一个程序,总觉得这个程序有点复杂,想在这里请教一下各位高手,有没有更简单一些的.<BR>由于本人水平有限,改了好久还是改不好.希望大家帮助.谢谢了.<BR><BR>#include<stdio.h><BR>int main()<BR>{<BR> int num[10][10]={1};<BR> int i,j;<BR> printf("%4d",num[0][0]);<BR> for(i=1;i<=9;i++)<BR> {<BR> printf("\n");<BR> for(j=0;j<=i;j++)<BR> {<BR> if(j>=1&&j<=i-1)<BR> {<BR> num[i][j]=num[i-1][j-1]+num[i-1][j];<BR> printf("%4d",num[i][j]);<BR> }<BR> if(j==0)<BR> {<BR> num[i][j]=num[i-1][j];<BR> printf("%4d",num[i][j]);<BR> }<BR> if(j==i)<BR> {<BR> num[i][j]=num[i-1][j-1];<BR> printf("%4d",num[i][j]);<BR> }<BR> }<BR> }<BR> printf("\n");<BR> return 0;<BR>}<BR><BR>[em13][em13] <P>你的程序很不错,杨辉三角的特点用上了。<BR>可以试从另外的特点加以改进算法:<BR><BR>第一列和对较线都为1,可直接赋值1<BR>第二列和紧靠对角线的斜边为123456789;<BR>每一行的数字是对称的。<BR></P> <引用别人结果,特此声明><BR>本程序应是根据以上递归的数学表达式编制的。<BR>*程序说明与注释<BR>#include<stdio.h><BR>int main()<BR>{<BR>int i,j,n=13;<BR>printf("N=");<BR>while(n>12)<BR>scanf("%d",&n); /*控制输入正确的值以保证屏幕显示的图形正确*/<BR>for(i=0;i<=n;i++) /*控制输出N行*/<BR>{<BR>for(j-0;j<24-2*i;j++) printf(" "); /*控制输出第i行前面的空格*/<BR>for(j=1;j<i+2;j++) printf("%4d",c(i,j)); /*输出第i行的第j个值*/<BR>printf("\n");<BR>}<BR>}<BR><BR>void int c(int x,int y) /*求杨辉三角形中第x行第y列的值*/<BR>{<BR>int z;<BR>if((y==1)||(y==x+1)) return 1; /*若为x行的第1或第x+1列,则输出1*/<BR>z=c(x-1,y-1)+c(x-1,y); /*否则,其值为前一行中第y-1列与第y列值之和*/<BR>return z;<BR>} LS,人家要求用二维数组呢……虽然你用递归也很好……<BR>#include<stdio.h><BR>int main(){<BR> int a[10][10]={1},i,j;<BR> for(i=0;i<10;i++){<BR> for(j=0;j<=i;j++){<BR> if(i==0 || j==0 || i==j)<BR> a[i][j]=1;<BR> else <BR> a[i][j]=a[i-1][j-1]+a[i-1][j];<BR> printf("%4d",a[i][j]);<BR> }<BR> putchar('\n');<BR> }<BR> getchar();<BR> return 0;<BR>}<BR><BR>这是我的答案,原理和LZ的一样。 <P>抱歉啊,上面的程序的i==0其实是不需要的……现改过……<br>不过似乎浪费了一半的空间……用三角矩阵的方法可以解决这个问题,但是那样的话就不是二维数组了……你们老师出的题可真是毒啊,想优化都做不到……[em05]</P><DIV class=htmlcode>#include<stdio.h><br>int main() {<br> int a[10][10]={0},i,j;<br> for (i=0;i<10;i++) {<br> for (j=0;j<=i;j++) {<br> if (j==0 || i==j)<br> a[i][j]=1;<br> else<br> a[i][j]=a[i-1][j-1]+a[i-1][j];<br> printf("%4d",a[i][j]);<br> }<br> putchar('\n');<br> }<br> getchar();<br> return 0;<br>}</DIV>
<P><br><br><br>另外,LZ不是要简单精炼的代码吗?这里有个超精炼的,嘿嘿,只是玩玩,可千万别照我这么写……交作业还是可以的~~这个代码还随便做了下简单的输出排版,看着舒服点,纯粹的无聊之作(不过这也是我喜欢用printf而不是cout的原因之一)[em05]</P>
<DIV class=htmlcode>#include<stdio.h><br>void main() {<br> int a[10][10]={0},i,j;<br> for (i=0;i<10;putchar('\n'),i++)<br> for (j=0;j<=i;j++) {<br> a[i][j]=!j||i==j?1:a[i-1][j-1]+a[i-1][j];<br> printf("%*d",!j?10-i<<1:4,a[i][j]);<br> }<br>}</DIV>
[align=right][color=#000066][此贴子已经被作者于2007-11-16 22:05:37编辑过][/color][/align]
回复:(StarWing83)抱歉啊,上面的程序的i==0其实是...
<P>强悍,我改了那么久也没改出好的,居然你一下子就搞定了,看来我要好好象各位学习了,<BR>尤其那个超级精练的代码,简直太完美了,我得好好学习学习.<BR>实在太感谢了.谢谢了.</P> 我觉得做这种题,要有比较好的,观察能力,嘿嘿页:
[1]
