Как рекурсивно умножить и распечатать цифры 2 чисел - PullRequest
0 голосов
/ 17 января 2019

Я ищу способ рекурсивного умножения цифр двух чисел (не обязательно одинаковой длины) без использования циклов следующим образом: скажем, числа 123 и 567. Я пытаюсь выяснить способ печати:

5
6
7
10
12
14
15
18
21

это самая левая цифра первого числа, умноженная на каждую цифру второго числа, начинающуюся слева и двигающуюся как в самом правом.

функция должна соответствовать прототипу:

void multi(int a, int b);

Мне удалось рекурсивно нырнуть до 1 и 5 оттуда до 1 56, а затем до 1 567, и при каждом вызове я печатаю результат% 10 * b% 10. но при возврате к 12 567 функция снова возвращается к 1 567.

вот моя лучшая попытка:

    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 голосов
/ 17 января 2019

Это возможное решение:

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));
}

Тестируемый ЗДЕСЬ .

0 голосов
/ 17 января 2019

Здесь выгода заключается в том, что вам нужно запустить подпрограмму для каждого значения sub со значением 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;
}

Надеюсь, это понятно и полезно, Удачи

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...