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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM