c语言实现打印杨辉三角
1 起因
好久没用c写一些逻辑代码了,被前端那堆整得脑子一团乱,于是给自己找点题练练手。 题目我自己定了一个,核心是杨辉三角经典算法。
2 题目
写一个程序,目的是打印出n行的杨辉三角,1<n<=10,其中,数字n需要从文件中读取, 文件为同级目录下的input.txt,如果无法获得正确的数值,则默认n=5。 打印输出不仅需要打印到屏幕,还需要同时打印到同级目录下的output.txt文件中,已存在则覆盖即可。
附加题:将输出打印成等腰三角形。
3 解题思路
杨辉三角结构:
行数 三角 1 1 2 1 1 3 1 2 1 4 1 3 3 1 5 1 4 6 4 1 6 1 5 10 10 5 1 ...
那么,第m行第n个数也就等于第m-1行第n个数加上第m-1行第n-1个数, 直到第2行第一个数为1,第二行第二个数为1。 以此作为递归条件即可
4 代码
#include <stdio.h> void fun(int num); void tab(int num); void row(int row); int num(int row, int col); int main(){ // 读取参数 int num = 5; FILE* input = fopen("input.txt", "r"); if (input != NULL){ if (fscanf(input, "%d", &num) != 1){ num = 5; } else if (num < 1 || num > 10) { num = 5; } fclose(input); } // 输出到屏幕 fun(num); // 输出到文件 // 将标准输入文件重定向至自定义的文件 // 平时最好别这么干 FILE* output = fopen("./output.txt", "w+"); if (output != NULL){ stdout = output; fun(10); } return 0; } /* 打印杨辉三角 */ void fun(int num){ int r; for (r=1; r<=num; r++){ // 等腰三角形对齐 tab(num-r); row(r); } } /* 打印num个制表符 */ void tab(int num){ while (num--){ fprintf(stdout, " "); } } /* 打印一行 */ void row(int row){ int col; // 打印递增的部分 for (col=1; col<=row/2; col++){ fprintf(stdout, "%d ", num(row, col)); } // 打印奇数个时候多出来的那个 if (row % 2){ fprintf(stdout, "%d ", num(row, col)); } // 打印后半部分,其实就是反过来输出左半部分 for (col=row/2; col>=1; col--){ fprintf(stdout, "%d ", num(row, col)); } fprintf(stdout, " "); } /* 递归计算当前数 * row 行 * col 列 */ int num(int row, int col){ if (row <= 2 || col <= 1 || row == col){ return 1; } else { return num(row-1, col) + num(row-1, col-1); } }
5 其他思路
其实如果是考试的话,在时间紧迫的情况下,可以变更一下思路,用更省力的方法, 比如可以定义一个10x10的二位数组,数组存放每层的数,这样再根据上面的计算原则来 执行就简单得多,相对不停的递归也更有效率一些,就是所谓的用空间换时间嘛。