Re: [问题] 九九乘法表不用循环是叫我直接从1列到81?

楼主: bbuc (C&C++完美经典)   2018-07-21 17:33:17
献丑一下....
稍微试着解决重复加法的问题
#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. 改善输出的排版;
: 我想将上述改进项目丢给学生当作业 (*笑*)
作者: Schottky (顺风相送)   2018-07-21 18:35:00
这招不错,用递回把计算结果传递下去
作者: oToToT (屁孩)   2018-07-21 19:15:00
我以为重复加法是某种做二进制拆分
作者: Schottky (顺风相送)   2018-07-21 21:06:00
二元树 divide & conquer 并不会节省加法的总数量啊

Links booklink

Contact Us: admin [ a t ] ucptt.com