我正在寻找一种方法,以递归方式将两个数字的数字(不一定是相同的数字长度)相乘,而不用以下方式使用循环: 假设数字是123和567。我正在尝试找出一种打印方法:
5
6
7
10
12
14
15
18
21
它是第一个数字的最左位数乘以第二个数字的每一个位数,从左到右移动。
该功能必须适合原型:
void multi(int a, int b);
我设法从那里递归地跳至1和5,依次跳至1 56和1 567,在每次调用中我都打印a%10 * b%10的结果。 但是当回溯到12567时,该功能会再次跳至1567。
这是我的最佳尝试:
int main()
{
int a, b;
scanf("%d %d", &a, &b);
multi(a, b);
return 0;
}
void multi(int a, int b)
{
if (a == 0)
return;
multi(a / 10, b);
if(b /10 != 0)
multi(a, b / 10);
printf("%d\n", a % 10 * b % 10);
}
限制列表:
no loops
single function
mandatory prototype
答案 0 :(得分:2)
这是一个可能的解决方案:
void multi(int a, int b)
{
// First "consume" the first parameter
if ( a > 9)
multi(a / 10, b);
// Then the second, passing only one digit of the first
if ( b > 9 )
multi(a % 10, b / 10);
// Multiply the last digits before backtracking
printf("%d\n", (a % 10) * (b % 10));
}
可测试的HERE。
答案 1 :(得分:1)
这里的问题是,您需要为每个子a的值以及所有sub b的值运行一个例程。
我认为您在这里需要更多的共识方法。您发送了降低的价格,但是您没有正确处理所有情况。
我建议一种更简单的方法,该方法采用值a和b,然后为每个子值运行一个例程,以通过每次传递整个b来显示所有不同的情况。 这样,对于每个sub值,您都可以获得与sub b值的所有乘法。
#include <stdio.h>
static void AuxMul(int a, int b)
{
int bs;
if(0 == b)
{
return;
}
bs = b%10; /*save res for multipication */
AuxMul(a, (b/10)); /*now sent it back with the same a value and reduced b value */
printf("|%d| \n", (a*bs));
}
void MultPrintRec( int a, int b)
{
int as = 0;
if (0 == a )
{
return;
}
as = a%10; /*get the value to mult. with all the b values */
MultPrintRec(a/10, b); /*do this until there is nothing to send */
AuxMul(as, b); /*send to a rec aux function that will take care of sub a value sent with all of the sub b values*/
}
int main() {
MultPrintRec(123, 567);
return 0;
}
希望这很清楚而且很有帮助,祝您好运