zoukankan      html  css  js  c++  java
  • c语言实现打印杨辉三角

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

    Date: 2018-06-21 09:38

    Author: su

    Created: 2018-06-21 四 10:15

    Validate

  • 相关阅读:
    bzoj3757 苹果树
    bzoj2743 [HEOI2012]采花
    bzoj4241 历史研究
    bzoj4448 [Scoi2015]情报传递
    bzoj3295 [Cqoi2011]动态逆序对
    bzoj4034 [HAOI2015]T2
    bzoj3339 Rmq Problem
    BZOJ 1017 魔兽地图
    BZOJ 1021 循环的债务
    SUOI #37 清点更多船只
  • 原文地址:https://www.cnblogs.com/recallfuture/p/9207454.html
Copyright © 2011-2022 走看看