编程论坛's Archiver

toms 发表于 2007-11-16 19:19

[讨论]关于用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&lt;stdio.h&gt;<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&lt;=9;i++)<BR> {<BR>  printf("\n");<BR>  for(j=0;j&lt;=i;j++)<BR>  {<BR>   if(j&gt;=1&amp;&amp;j&lt;=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]

h13077395959 发表于 2007-11-16 19:54

<P>你的程序很不错,杨辉三角的特点用上了。<BR>可以试从另外的特点加以改进算法:<BR><BR>第一列和对较线都为1,可直接赋值1<BR>第二列和紧靠对角线的斜边为123456789;<BR>每一行的数字是对称的。<BR></P>

h13077395959 发表于 2007-11-16 20:11

&lt;引用别人结果,特此声明&gt;<BR>本程序应是根据以上递归的数学表达式编制的。<BR>*程序说明与注释<BR>#include&lt;stdio.h&gt;<BR>int main()<BR>{<BR>int i,j,n=13;<BR>printf("N=");<BR>while(n&gt;12)<BR>scanf("%d",&amp;n); /*控制输入正确的值以保证屏幕显示的图形正确*/<BR>for(i=0;i&lt;=n;i++) /*控制输出N行*/<BR>{<BR>for(j-0;j&lt;24-2*i;j++) printf(" "); /*控制输出第i行前面的空格*/<BR>for(j=1;j&lt;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>}

StarWing83 发表于 2007-11-16 20:31

LS,人家要求用二维数组呢……虽然你用递归也很好……<BR>#include&lt;stdio.h&gt;<BR>int main(){<BR>    int a[10][10]={1},i,j;<BR>    for(i=0;i&lt;10;i++){<BR>        for(j=0;j&lt;=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的一样。

StarWing83 发表于 2007-11-16 20:56

<P>抱歉啊,上面的程序的i==0其实是不需要的……现改过……<br>不过似乎浪费了一半的空间……用三角矩阵的方法可以解决这个问题,但是那样的话就不是二维数组了……你们老师出的题可真是毒啊,想优化都做不到……[em05]</P>
<DIV class=htmlcode>#include&lt;stdio.h&gt;<br>int main() {<br>    int a[10][10]={0},i,j;<br>    for (i=0;i&lt;10;i++) {<br>        for (j=0;j&lt;=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&lt;stdio.h&gt;<br>void main() {<br>    int a[10][10]={0},i,j;<br>    for (i=0;i&lt;10;putchar('\n'),i++)<br>        for (j=0;j&lt;=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&lt;&lt;1:4,a[i][j]);<br>        }<br>}</DIV>
[align=right][color=#000066][此贴子已经被作者于2007-11-16 22:05:37编辑过][/color][/align]

toms 发表于 2007-11-17 12:03

回复:(StarWing83)抱歉啊,上面的程序的i==0其实是...

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

lusan168 发表于 2007-11-17 16:25

我觉得做这种题,要有比较好的,观察能力,嘿嘿

页: [1]

Powered by Discuz! Archiver 6.1.0  © 2001-2007 Comsenz Inc.