这已经是我学编程开始的第14次打卡了,很遗憾漏了那么多次,所以更要努力,砥砺前行。话不多说,进入正题:
这次做的题目是打印杨辉三角,下面是我在打代码前搜索的有关杨辉三角的相关知识:
- 基本定义:杨辉三角形第n层(顶层称第 0 层,第 1 行,第 n 层即第 n+1 行,此处 n 为包含 0 在内的自然数)正好对应于二项式展开的系数。例如第二层 1 2 1 是幂指数为 2 的二项式展开形式的系数。
- 涉及到的性质:
(1)杨辉三角以正整数构成,数字左右对称,每行由1开始逐渐变大,然后变小,回到1。(1)杨辉三角以正整数构成,数字左右对称,每行由1开始逐渐变大,然后变小,回到1。
(2)第n行的数字个数为n个。
(3)除每行最左侧与最右侧的数字以外,每个数字等于它的左上方与右上方两个数字之和(也就是说,n行第k个数字等于第 n-1 行的第 k-1 个数字与第k个数字的和)。
思路:
基本思路我已经写在了代码中,主要的中心思想是每行除了头尾的1以外的数字的计算,存储与输出,每次计算涉及到两行数字,因此我首先想到的是运用数组,因此我在代码里运用的是二维数组。
代码如下:
#include<stdio.h>
int main()
{
//需要一个行数,需要读入
int n;
//需要一个数组来存储和输出每一行的除了两边的1的中间数字
int num[1000][100];
scanf("%d",&n);
//如果用二维数组的话,就需要两个变量来控制行数和列数
//不能倒序输出,因此需要一个变量来从1到n输出每一行数字
int h;
for(h=0;h<n+1;h++){
//因为每行的列数都要从头计数,因此把初始化放在行数循环里
int lie=0;
//说明每行第一列都是1
num[h][lie]=1;
printf("%6d", num[h][lie]);
lie++;
if(h==0){
printf("\n");
}
//根据杨辉三角的性质:第n行一共有n个数,因此需要一个变量来控制每行数字的个数
for(;lie<h;lie++){
num[h][lie] = num[h-1][lie-1] + num[h-1][lie];
printf("%6d",num[h][lie]);
}
//输出n行的第n个数
if(lie==h){
num[h][lie] = 1;
printf("%6d\n",num[h][lie]);
}
}
return 0;
}
笔记:
在写代码的途中出现了错误,编译正确,但是却在运行时程序直接被系统关掉了,求教后才知道出现这种原因的可能是环境有问题或者程序有问题,一般是程序出了错误,逻辑错误。重新整理了思路之后发现,错误出在了二维数组那里,num[1000][1000]改成num[1000][100]就解决了问题,列数的问题,看来不能贪心,一次定义不要太多。
心得:
努力打基础,多打代码,天天向上(好吧,我承认我不太善言语,嗯,就这样)