标签:需要 def 数组 两种方法 赋值 必须 font std har
题目----杨辉三角形是(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²
标签:需要 def 数组 两种方法 赋值 必须 font std har
原文地址:https://www.cnblogs.com/hpthinking/p/12173095.html