题目>>>
用C语言打印杨辉三角。杨辉三角参考图如下:
分析>>>
于是不清楚杨辉三角的同学们可以上网查查,可以立刻知道它的相关推理归纳和公式总结。它的简介如下:
所以我们可以使用二项式的方法来写代码。但我下面要讲的是直接观察已有数据来写。
下面再放上一张多数据的图便于我们找规律:
直观看出三角形的两边都是 1 ,每一行的数的个数等于该行行数。(从第三行开始)被两边的 1 包围着的数据中,每个数等于它上一行前一列的数和上一行本列数之和。OK ,这是关于数字。
不要忘了“三角形”效果,我们知道要打印出三角形效果就要在每行开始先打印空格,把数字挤到中间,在按照行数依次减少空格。
思考>>>
仔细观察,根据以上分析,我们发现每步打印都与该行行数相关。中间数据由其上一行数据控制,而上一行数据最终由三角形边上的 1 控制。所以我们可以使用二维数组。使用二维数组就可以同时对相邻两行的数据按照相同的规则进行操作,三角形中间数据的计算和使用恰好要同时使用两行数据。
接着先写循环把二维数组对应三角形的边的部分赋值为 1 ,就可以处理中间数据了。
在这里需要注意的是,因为对上一段落代码的实现有些小复杂。 我们先研究数字打印,最后在无脑加上这些空格,还原成三角形。然后一步一步来写,写完一步打印出来看看结果,正确了就继续写。
代码>>>
就是先实现这张图:
打印 1 >>>
每行首元素是 1 ,第 n 行 的第 n 个元素是 1 。(末位)
#include<stdio.h>int main(){int arr[10][10] = { 0 }; //要先初始化int a = 1;int b = 1;for (a = 0; a < 10; a++){arr[a][0] = 1; //每行首元素是 1for (b = 0; b <=a; b++){if(a==b)arr[a][b] = 1; //每行末位是 1}}//打印出来看看上面写的对不对for (a = 0; a < 10; a++){for (b = 0; b <=a; b++){printf("%d ", arr[a][b]);}printf("\n");}return 0;}
注意访问数组是从下标0开始的。(数组的最低下标是0)此处数组下标0对应第一行。
打印结果图:
打印中间数据 >>>
要操作每个中间数据,就继续在循环内部加上 arr[a][b]的值在打印。
#include<stdio.h>int main(){int arr[10][10] = { 0 };int a = 1;int b = 1; for (a = 0; a < 10; a++){arr[a][0] = 1;for (b = 0; b <=a; b++){if(a==b) { arr[a][b] = 1; }if(a>1 && b>=1) //注意这里的判断条件 {arr[a][b] = arr[a - 1][b - 1] + arr[a - 1][b];//上一行前一列和本列数之和 } printf("%d ", arr[a][b]);//赋值完一行后直接整行数据都打印}printf("\n");}return 0;}
打印效果图:
注意这里的判断条件,1表示的是视觉上的第二行(行数从0开始计算)。根据“杨辉三角”我们可以看出在视觉上的第三行第二列才开始计算中间数据。
打印空格>>>
b-- 先使用再减减。
//b = 10 - a;//while (b--)//{//printf(" ");//}//喜欢两种循环的都可以参考一下,上面精简点for (b = 10 - a; b > 0; b--){printf(" ");}
总代码>>>
int main(){int arr[10][10] = { 0 };int a = 1;int b = 1;for (a = 0; a < 10; a++){b = 10 - a; while (b--){printf(" ");}arr[a][0] = 1;//注意访问数组是从0开始(数组的最低下标是0)for (b = 0; b <=a; b++){if(a==b)arr[a][b] = 1;if(a>1 && b>=1)arr[a][b] = arr[a - 1][b - 1] + arr[a - 1][b];//上一行前一列和本列数之和printf("%d ", arr[a][b]);//赋值完一行后直接打印得到的整体打印效果就是直接}printf("\n");}return 0;}
最终效果图:
emmmm,好像现实打印出来的三角还是丑了点,至于解决办法,我暂时没想到。(菜还是我菜.jpg) 哪位大佬知道的话欢迎评论留言给我解答,十分感谢。 ^ ^
小小思考>>>
使用二维数组可以同时改变相关性强的行和列,注意它的巧妙使用。可以看看我写的C语言游戏来练习二维数组的使用。嘿嘿,博客链接 —> [C语言] [游戏] 三子棋 和 [C语言] [游戏] 扫雷
刚开始分着写,每写完一层后就打印确认一下。写完后发现赋值和打印使用的相同的循环,故可以把它们放在一起写,还有那个while循环的后置加加条件也很好,精简了代码。
我们对下一行的数来赋值,这样做的好处是不改变上一行的值,对于本题也更符合实际规律,让其按顺序打印,这样避免了可能的手滑。
最重要的话>>>
不理解的记得私信我哦 ^ ^。
(直接评论区留言也可以^ ^)
———————————————————————————————————————————
十分感谢评论区大佬们的解答——把while循环中打印空格的地方从原来的打印一个空格改成打印两个空格。然后把for循环中打印数值那使用 printf("%-3d ", arr[a][b]); 表示以左对齐、默认3个字符宽度打印数据。那么就能把每一列的宽度都确定为3个字符,也就是每个数字之间的间隙变为固定的了。
然后执行结果是这样,美观多了。^ ^