看板 C_and_CPP 關於我們 聯絡資訊
獻醜一下.... 稍微試著解決重複加法的問題 #include <stdio.h> void func(int x,int y,int z) { printf("%d x %d = %2d%s",x,y,z,((y==9)?"\n":" ")); if ( y == 9 && x < 9 ) func(x+1,1,x+1); else if ( y < 9 ) func(x,y+1,z+x); } int main() { func(1,1,1); return 0; } ※ 引述《jserv (松鼠)》之銘言: : ※ 引述《red0whale (red whale)》之銘言: : : 剛才做題目, : : https://i.imgur.com/NI4TYj5.jpg
: : 不用迴圈叫我列九九乘法表是哪招? : : 說實在我真想不到不用迴圈就能簡單列出九九乘法表的方法了 : 不用 iteration,就用 recursion,順便預測出題者還不准你用乘法操作。 : 這裡提供一份實作程式碼: : #include <stdio.h> : int mul(int x, int y) { : if (!x || !y) return 0; : return x + mul(x, y - 1); : } : void table_row(int x, int y) { : if (y > 1) table_row(x, y - 1); : printf("%d x %d = %2d | ", x, y, mul(x, y)); : } : void mult_table(int x, int y) { : if (x > 1) mult_table(x - 1, y); : table_row(x, y); : printf("\n"); : } : int main() { : mult_table(9, 9); : return 0; : } : 參考輸出: : 1 x 1 = 1 | 1 x 2 = 2 | 1 x 3 = 3 | 1 x 4 = 4 | 1 x 5 = 5 ... : 2 x 1 = 2 | 2 x 2 = 4 | 2 x 3 = 6 | 2 x 4 = 8 | 2 x 5 = 10 ... : 3 x 1 = 3 | 3 x 2 = 6 | 3 x 3 = 9 | 3 x 4 = 12 | 3 x 5 = 15 ... : ... : 9 x 1 = 9 | 9 x 2 = 18 | 9 x 3 = 27 | 9 x 4 = 36 | 9 x 5 = 45 ... : 乍看可滿足題目要求,不過仍有大量改進空間: : 1. 乘法實作可避免大量重複的加法; : 2. 九九乘法中 3 * 8 和 8 * 3 的輸出數值相等,這類運算也可避免; : 3. 實作用到三個遞迴函式,可縮減; : 4. if (x > 1) 和 if (y > 1) 這類比較也可縮減次數,甚至免去比較 : (美妙的 bitwise 操作); : 5. 改善輸出的排版; : 我想將上述改進項目丟給學生當作業 (*笑*) -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 60.250.205.229 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1532165600.A.763.html
Schottky: 這招不錯,用遞迴把計算結果傳遞下去 07/21 18:35
oToToT: 我以為重複加法是某種做二進位拆分 07/21 19:15
※ 編輯: bbuc (60.250.205.229), 07/21/2018 19:20:41
Schottky: 二元樹 divide & conquer 並不會節省加法的總數量啊 07/21 21:06