Переделать один из циклов на рекурсию - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Помогите пожалуйста розобраться в коде и переделать один из циклов на рекурсию.
#include<stdio.h>
#include<math.h>
#include <conio.h>
 
#define MAX 10000
 
char* Multipty(char [],char[]);
 
int main()
{
 
    char a[MAX];
    char b[MAX];
 
    printf("Enter a: ");
    scanf("%s", a);
 
    printf("Enter b: ");
    scanf("%s", b);
 
    printf("\na * b = %s\n", Multipty(a, b));
 
    getch();
    return 0;
}
 
char* Multipty(char a[], char b[])
{
    static char result[MAX];
    char c[MAX];
    char temp[MAX];
    int la, lb;
    int i, j, k = 0, x = 0, y;
    long int r = 0;
    long sum = 0;
 
    for (i = 0; a[i] != '\0'; i++)
    {
        la = i;
    }
    for (j = 0; b[j] != '\0'; j++)
        lb = j;
 
    for(i = 0; i <= la; i++)
    {
        a[i] = a[i] - 48;
    }
    for(i = 0; i <= lb; i++)
    {
        b[i] = b[i] - 48;
    }
 
    for(i = lb; i >= 0; i--)
    {
        r = 0;
        for(j = la; j >= 0; j--)
        {
            temp[k++] = (b[i] * a[j] + r) % 10;
            r = (b[i] * a[j] + r) / 10;
        }
 
        temp[k++] = r;
        x++;
 
        for(y = 0; y < x; y++)
        {
            temp[k++] = 0;
        }
    }
 
    k = 0;
    r = 0;
    for(i = 0; i < la + lb + 2; i++)
    {
        sum = 0;
        y = 0;
        for(j = 1; j <= lb + 1; j++)
        {
            if(i <= la + j)
            {
                sum = sum + temp[y+i];
            }
            y += j + la + 1;
        }
 
        c[k++] = (sum + r) % 10;
        r = (sum + r) / 10;
    }
 
    c[k] = r;
    j = 0;
    for(i = k - 1; i >= 0; i--)
    {
        result[j++] = c[i] + 48;
    }
    result[j] = '\0';
 
    return result;
}

Решение задачи: «Переделать один из циклов на рекурсию»

textual
Листинг программы
#include <stdio.h>
#include <math.h>
#include <conio.h>
#include <string.h> 
 
#define MAX 10000
 
char* Multipty(char [],char[]);
 
/* Рекурсивная процедура вычисления неполного произведения */
 
int cmult(char *a, char *temp, char b, int k, int j, int *r)
{
     if (j < 0)
     {
        return k;
     }
     else
        {
           temp[k++]=(b * a[j] + *r) % 10;
           *r= (b * a[j] + *r) / 10;
           cmult(a,temp,b,k,j-1,r);
        }
 
}
 
int main()
{
 
    char a[MAX];
    char b[MAX];
 
    printf("Enter a: "); /* ввод первого */
    scanf("%s", a);
 
    printf("Enter b: "); /* ввод второго */
    scanf("%s", b);
 
    printf("\na * b = %s\n", Multipty(a, b)); /* печать произведения */
 
    getch();
    return 0;
}
 
char* Multipty(char a[], char b[])
{
    static char result[MAX];
    char c[MAX];
    char temp[MAX];
    int la, lb;
    int i, j, k = 0, x = 0, y;
    int r = 0;
    long sum = 0;
 
    for (i = 0; a[i] != '\0'; i++)  /* определение длины 1-го сомножителя */
        la = i;
 
    for (j = 0; b[j] != '\0'; j++) /* определение длины 2-го сомножителя */
        lb = j;
 
    for(i = 0; i <= la; i++)
    {
        a[i] = a[i] - 48;           /* из ASCII кодов -> число [0-9] */
    }
    for(i = 0; i <= lb; i++)
    {
        b[i] = b[i] - 48;          /* из ASCII кодов -> число [0-9] */
    }
 
    for(i = lb; i >= 0; i--)
    {
 
        r=0;
 
        k=cmult(a,temp,b[i],k,la,&r);  /*  рекурсивное вычисление неп. произведения */      
 
        temp[k++] = r;                 /* последний перенос */
        x++;
 
        for(y = 0; y < x; y++)         /* остальные разряды неполного произведения зануляем */
        {
            temp[k++] = 0;
        }
    }
 
    /* прибавление очередного неполного произведения */
    /* к общему результату */
 
    k = 0;
    r = 0;
    for(i = 0; i < la + lb + 2; i++)
    {
        sum = 0;
        y = 0;
        for(j = 1; j <= lb + 1; j++)
        {
            if(i <= la + j)
            {
                sum = sum + temp[y+i];
            }
            y += j + la + 1;
        }
 
        c[k++] = (sum + r) % 10; /* младшая цифра суммы */
        r = (sum + r) / 10;          /* перенос */
    }
 
    c[k] = r;
    j = 0;
    for(i = k - 1; i >= 0; i--)
    {
        result[j++] = c[i] + 48;  /* перевод из числа в ASCII */
    }
    result[j] = '\0';
 
    return result;
}

Объяснение кода листинга программы

Код выполняет вычисление произведения двух строк. Задача заключается в том, чтобы переписать один из циклов с использованием рекурсии.

  1. Переменные:
    • a, b: строки, которые нужно перемножить
    • MAX: максимальная длина строки
    • temp: временный массив для хранения промежуточных результатов
    • r: вспомогательная переменная для хранения переносов
    • result: результат умножения
    • c: массив для хранения разрядов результата
    • k: индекс в массиве c
    • la, lb: длины строк a и b
    • i, j: индексы для обхода строк a и b
    • x: количество разрядов в результате
    • y: вспомогательный индекс для обхода массива c
    • sum: сумма разрядов в текущем неполном произведении
  2. В функции main() происходит следующее:
    • Считывание строк a и b с помощью scanf()
    • Вычисление произведения с помощью функции Multipty()
    • Печать произведения с помощью printf()
  3. В функции Multipty() происходит следующее:
    • Преобразование символов строк a и b из ASCII в числа
    • Рекурсивное вычисление неполного произведения с помощью функции cmult()
    • Зануление остальных разрядов неполного произведения
    • Прибавление очередного неполного произведения к общему результату
    • Перевод результата из числа в ASCII и возврат результата
  4. В функции cmult() происходит следующее:
    • Рекурсивное вычисление неполного произведения
    • Если j < 0, то возвращается k
    • В противном случае, происходит вычисление следующего разряда и рекурсивный вызов cmult()
  5. В цикле в функции Multipty() происходит следующее:
    • Перебор всех разрядов результата
    • Вычисление суммы разрядов текущего неполного произведения
    • Добавление младшей цифры суммы к массиву c
    • Перенос старших разрядов суммы
    • Зануление остальных разрядов результата
    • Перевод числа в ASCII и добавление к результату
  6. В цикле в функции main() происходит следующее:
    • Перебор всех символов в строке a
    • Считывание соответствующих символов из строки b
    • Вычисление произведения соответствующих символов
    • Печать полученного произведения

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

9   голосов , оценка 4 из 5
Похожие ответы