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的二位數組,數組存放每層的數,這樣再根據上面的計算原則來 執行就簡單得多,相對不停的遞歸也更有效率一些,就是所謂的用空間換時間嘛。