| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1950 人关注过本帖
标题:关于杨辉三角的解法与优化
只看楼主 加入收藏
liyanhong
Rank: 3Rank: 3
来 自:水星
等 级:禁止访问
威 望:8
帖 子:1867
专家分:0
注 册:2008-5-3
收藏
 问题点数:0 回复次数:15 
关于杨辉三角的解法与优化
我是一名初学者  以下是我给出的代码
希望高手们有好的解法(优化)请不吝赐教......
#define N 10
setdate(int (*s)[N],int n)
{
   int i,j;
   for(i=0;i<n;i++)
    {
      s[i][0]=1;
      s[i][i]=1;
    }
   for(i=2;i<n;i++)
    {
      for(j=1;j<n;j++)
      s[i][j]=s[i-1][j]+s[i-1][j-1];
    }
     
}
outdate(int s[][N],int n)
{
   int i,j;
   for(i=0;i<n;i++)
    {
   for(j=0;j<=i;j++)
     printf("%4d",s[i][j]);
     printf("\n");
    }
}
main()
{
   int y[N][N];
   clrscr();
   setdate(y,7);
   outdate(y,7);
}

[[it] 本帖最后由 liyanhong 于 2008-6-1 00:28 编辑 [/it]]
搜索更多相关主题的帖子: 解法 杨辉三角 
2008-05-31 21:20
mqh21364
Rank: 1
等 级:新手上路
帖 子:642
专家分:0
注 册:2008-2-28
收藏
得分:0 
setdate第一个参数怎么不用数组啊?

前不见古人,后不见来者。念天地之悠悠,独怆然而涕下。
2008-05-31 22:57
liyanhong
Rank: 3Rank: 3
来 自:水星
等 级:禁止访问
威 望:8
帖 子:1867
专家分:0
注 册:2008-5-3
收藏
得分:0 
数组作为参数不是有三种形式吗
*(s)[N]


s[M][N]
s[][N]

爱上你 是 我的错  可是离 开  又舍不得  听着你为我写的歌     好难过
如果说 我说如果  我们还 能  重新来过   不去计 较 谁对谁错  会怎么做
2008-05-31 23:05
StarWing83
Rank: 8Rank: 8
来 自:仙女座大星云
等 级:贵宾
威 望:19
帖 子:3951
专家分:748
注 册:2007-11-16
收藏
得分:0 
浪费……

专心编程………
飞燕算法初级群:3996098
我的Blog
2008-05-31 23:49
liyanhong
Rank: 3Rank: 3
来 自:水星
等 级:禁止访问
威 望:8
帖 子:1867
专家分:0
注 册:2008-5-3
收藏
得分:0 
#define N 10
setdate(int s[][N],int n)//改了
{
   int i,j;
   for(i=0;i<n;i++)
   {
     s[i][0]=1;
     s[i][i]=1;
   }
   for(i=2;i<n;i++)
   {
   for(j=1;j<n;j++)
   s[i][j]=s[i-1][j]+s[i-1][j-1];
   }
     
}
outdate(int s[][N],int n)
{
   int i,j;
   for(i=0;i<n;i++)
   {
   for(j=0;j<=i;j++)
   printf("%4d",s[i][j]);
   printf("\n");
   }
}
main()
{
   int y[N][N];
   clrscr();
   setdate(y,7);
   outdate(y,7);
}

爱上你 是 我的错  可是离 开  又舍不得  听着你为我写的歌     好难过
如果说 我说如果  我们还 能  重新来过   不去计 较 谁对谁错  会怎么做
2008-06-01 00:17
liyanhong
Rank: 3Rank: 3
来 自:水星
等 级:禁止访问
威 望:8
帖 子:1867
专家分:0
注 册:2008-5-3
收藏
得分:0 
转自哪忘了
天下算法一大抄  你可赞同呢

杨辉三角形是形如
1
1   1
1   2   1
1   3   3   1
1   4   6   4   1
的三角形,其实质是二项式(a+b)的n次方展开后各项的系数排成的三角形,它的特点是左右两边全是1,从第二行起,中间的每一个数是上一行里相邻两个数之和。这个题目常用于程序设计的练习。
下面给出六种不同的解法。
解法一
#include   <stdio.h>
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   <stdio.h>
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   <stdio.h>
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   <stdio.h>
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 <stdio.h>
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   <stdio.h>
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");
   }
}

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



有关代码如何优化  请阅读《编译原理》十一章
PS   全书我只看懂这里的一点点

[[it] 本帖最后由 liyanhong 于 2008-6-1 22:34 编辑 [/it]]

爱上你 是 我的错  可是离 开  又舍不得  听着你为我写的歌     好难过
如果说 我说如果  我们还 能  重新来过   不去计 较 谁对谁错  会怎么做
2008-06-01 12:40
雨中飛燕
Rank: 1
等 级:新手上路
帖 子:765
专家分:0
注 册:2007-10-13
收藏
得分:0 
很nice,如果这么说,还有四种以上的写法

" border="0" />[color=white]
2008-06-01 12:46
liyanhong
Rank: 3Rank: 3
来 自:水星
等 级:禁止访问
威 望:8
帖 子:1867
专家分:0
注 册:2008-5-3
收藏
得分:0 
orz....

爱上你 是 我的错  可是离 开  又舍不得  听着你为我写的歌     好难过
如果说 我说如果  我们还 能  重新来过   不去计 较 谁对谁错  会怎么做
2008-06-01 13:17
flyue
Rank: 10Rank: 10Rank: 10
来 自:江南西道
等 级:贵宾
威 望:19
帖 子:3465
专家分:1563
注 册:2006-6-20
收藏
得分:0 
杨辉三角在国外叫“Pascal Triangle”

天之道,损有余而补不足.人之道则不然,损不足以奉有余.孰能有余以奉天下,唯有道者.
2008-06-01 13:23
卧龙孔明
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:59
帖 子:3872
专家分:684
注 册:2006-10-13
收藏
得分:0 
dp....

My Blog: www.aiexp.info
虽然我的路是从这里开始的,但是这里不再是乐土.感谢曾经影响过,引导过,帮助过我的董凯,飞燕,leeco,starwing,Rockcarry,soft_wind等等等等.别了,BCCN.
2008-06-01 19:15
快速回复:关于杨辉三角的解法与优化
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.026454 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved