如何以递归方式乘以2的数字并打印出来

时间:2019-01-17 08:52:57

标签: c recursion

我正在寻找一种方法,以递归方式将两个数字的数字(不一定是相同的数字长度)相乘,而不用以下方式使用循环: 假设数字是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

2 个答案:

答案 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;
}

希望这很清楚而且很有帮助,祝您好运