Переделать один из циклов на рекурсию - 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;
- }
Объяснение кода листинга программы
Код выполняет вычисление произведения двух строк. Задача заключается в том, чтобы переписать один из циклов с использованием рекурсии.
- Переменные:
- a, b: строки, которые нужно перемножить
- MAX: максимальная длина строки
- temp: временный массив для хранения промежуточных результатов
- r: вспомогательная переменная для хранения переносов
- result: результат умножения
- c: массив для хранения разрядов результата
- k: индекс в массиве c
- la, lb: длины строк a и b
- i, j: индексы для обхода строк a и b
- x: количество разрядов в результате
- y: вспомогательный индекс для обхода массива c
- sum: сумма разрядов в текущем неполном произведении
- В функции main() происходит следующее:
- Считывание строк a и b с помощью scanf()
- Вычисление произведения с помощью функции Multipty()
- Печать произведения с помощью printf()
- В функции Multipty() происходит следующее:
- Преобразование символов строк a и b из ASCII в числа
- Рекурсивное вычисление неполного произведения с помощью функции cmult()
- Зануление остальных разрядов неполного произведения
- Прибавление очередного неполного произведения к общему результату
- Перевод результата из числа в ASCII и возврат результата
- В функции cmult() происходит следующее:
- Рекурсивное вычисление неполного произведения
- Если j < 0, то возвращается k
- В противном случае, происходит вычисление следующего разряда и рекурсивный вызов cmult()
- В цикле в функции Multipty() происходит следующее:
- Перебор всех разрядов результата
- Вычисление суммы разрядов текущего неполного произведения
- Добавление младшей цифры суммы к массиву c
- Перенос старших разрядов суммы
- Зануление остальных разрядов результата
- Перевод числа в ASCII и добавление к результату
- В цикле в функции main() происходит следующее:
- Перебор всех символов в строке a
- Считывание соответствующих символов из строки b
- Вычисление произведения соответствующих символов
- Печать полученного произведения
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д