c语言实现打印杨辉三角

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, "\t");
  }
}

/* 打印一行 */
void row(int row){
  int col;
  // 打印递增的部分
  for (col=1; col<=row/2; col++){
    fprintf(stdout, "%d\t\t", num(row, col));
  }

  // 打印奇数个时候多出来的那个
  if (row % 2){
    fprintf(stdout, "%d\t\t", num(row, col));
  }

  // 打印后半部分,其实就是反过来输出左半部分
  for (col=row/2; col>=1; col--){
    fprintf(stdout, "%d\t\t", num(row, col));
  }

  fprintf(stdout, "\n");
}

/* 递归计算当前数
 * 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的二位数组,数组存放每层的数,这样再根据上面的计算原则来 执行就简单得多,相对不停的递归也更有效率一些,就是所谓的用空间换时间嘛。

Date: 2018-06-21 09:38

Author: su

Created: 2018-06-21 四 10:15

Validate

猜你喜欢

转载自www.cnblogs.com/recallfuture/p/9207454.html