3---数组之杨辉三角

题目----杨辉三角形是(a+b)^n展开后各项的系数。如(a+b)^4展开后各项的系数为1,4,6,4,1。

  输出杨辉三角形为:

        1

        1  1

        1  2  1

        1  3  3  1

        1  4  6  4  1

  特点:0列和对角线元素都是1。其他元素均为上一行的同列元素与前一列元素之和。

 

思路:

  ①C语言定义二维数组时,它的行数和列数都必须确定。

  ②怎么可以对0列和对角线元素赋初值???

        观察可以发现,第一行1个元素、第二行2个元素、第三行3个元素、第四行4个元素、第五行5个元素

        那么就是有几行就有几列,而0列的元素置1,只需要把列数置为0就可以了。每一行的最后一个元素置1,就是[i][i]了。这样的话就可以给第0列和每一行的最后一列赋初值了。  

代码代码代码:

 1 #include <stdio.h>
 2 #define N 5
 3 int main(){
 4     int i,j;
 5     int str[N][N];
 6 
 7     for(i=0;i<N;i++){
 8             str[i][0]=1;            /*0列元素置1*/
 9             str[i][i]=1;        /*对角线元素置1*/ 
10         for(j=1;j<i;j++){                /*0,1两行不用算*/ 
11             str[i][j]=str[i-1][j]+str[i-1][j-1];
12         }
13             
14         for(j=0;j<=i;j++){        //对数组中的元素遍历输出 
15             printf("%d ",str[i][j]);
16         } 
17         printf("\n");
18     }        
19 } 

总结:  

    7~12代码因为0,1行不用算,所以这里的j是从1开始的,通过设置j和i的关系,使得开始从2行开始算

    可以算一行之后就把那一行的数据输出出来

再来一种方法:

 1 int main(){
 2     int i,j;
 3     char str[N][N];
 4     
 5     for(i=0;i<N;i++){
 6         for(j=0;j<=i;j++){
 7             
 8             if(i==0 || j==0 || i==j){
 9                 str[i][j]=1;
10             }else{
11                 str[i][j]=str[i-1][j]+str[i-1][j-1];
12             }
13         }
14         
15         for(j=0;j<=i;j++){
16             printf("%d ",str[i][j]);
17         }    
18         printf("\n");            /*每一行输出完后换行*/ 
19     }    
20 } 

总结:

  第二种不同之处就在于它是通过这个判断条件来为0列和对角线元素赋值的,那么这个判断条件为什么要这么写???

      i==0-----把第一行说了

      j==0-----把第一列说了

      i==j-----把对角线说了

  两种方法都可以,时间复杂度也都是两个for循环-----n²

猜你喜欢

转载自www.cnblogs.com/hpthinking/p/12173095.html